ruby-on-rails 在ruby on rails的关联中找到所有nil

z2acfund  于 2023-11-20  发布在  Ruby
关注(0)|答案(6)|浏览(119)

在这里,我得到了PropertyUsers之间的一对多关系:

class Property < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :property
end

字符串
我怎么能得到所有不属于任何用户的属性?

yhuiod9q

yhuiod9q1#

要获取所有没有用户的属性,请尝试以下操作:

Property.includes(:users).where(users: { property_id: nil })

字符串

t1rydlwq

t1rydlwq2#

另一种方法是写一些SQL

Property.joins("LEFT OUTER JOIN users ON users.property_id = properties.id").
where('users.id IS NULL').
uniq

字符串
上面的代码将被转换为以下对数据库的纯SQL查询:

SELECT DISTINCT properties.* FROM properties 
LEFT OUTER JOIN users on users.property_id = properties.id 
WHERE users.id IS NULL;


LEFT JOIN关键字返回左表中的所有行(properties),匹配的行在右表中(users)。当没有匹配时,结果是右侧的NULL。然后WHERE关键字通过一个条件过滤结果,即我们只对右侧有NULL的行感兴趣。


的数据
参考:SQL LEFT JOIN Keyword

ercv8c1e

ercv8c1e3#

你也可以这样做:

Property.where('id NOT IN (SELECT DISTINCT(property_id) FROM users)')

字符串
另一种选择是:

Property.where("(select count(*) from users where property_id = properties.id) = 0")


您可以根据您的应用程序检查哪一个更有效,方法是检查执行查询所需的时间并相应地选择一个选项。

vxqlmq5t

vxqlmq5t4#

你也可以根据这个查询来写作用域,只是为了方便使用。

class Property < ActiveRecord::Base
  has_many :users
  scope :incomplete, -> { joins(:users).where("property.user_id is null") }
end

字符串
然后,您可以像这样调用此作用域:Property.incomplete

emeijp43

emeijp435#

你可以试试这个查询:

Property.where.not(:id=>User.where.not(:property_id=>nil).pluck(:property_id))

字符串

Property.where.not(:id=>User.where.not(:property_id=>nil).pluck("DISTINCT property_id"))

fcy6dtqo

fcy6dtqo6#

使用此代码:

@users= User.includes(:properties).where(properties: { property_id: nil })

字符串

相关问题