在这里,我得到了Property和Users之间的一对多关系:
Property
Users
class Property < ActiveRecord::Base has_many :users end class User < ActiveRecord::Base belongs_to :property end
字符串我怎么能得到所有不属于任何用户的属性?
yhuiod9q1#
要获取所有没有用户的属性,请尝试以下操作:
Property.includes(:users).where(users: { property_id: nil })
字符串
t1rydlwq2#
另一种方法是写一些SQL:
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的行感兴趣。
LEFT JOIN
properties
users
NULL
WHERE
的数据参考:SQL LEFT JOIN Keyword
ercv8c1e3#
你也可以这样做:
Property.where('id NOT IN (SELECT DISTINCT(property_id) FROM users)')
字符串另一种选择是:
Property.where("(select count(*) from users where property_id = properties.id) = 0")
型您可以根据您的应用程序检查哪一个更有效,方法是检查执行查询所需的时间并相应地选择一个选项。
vxqlmq5t4#
你也可以根据这个查询来写作用域,只是为了方便使用。
class Property < ActiveRecord::Base has_many :users scope :incomplete, -> { joins(:users).where("property.user_id is null") } end
字符串然后,您可以像这样调用此作用域:Property.incomplete
Property.incomplete
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"))
型
fcy6dtqo6#
使用此代码:
@users= User.includes(:properties).where(properties: { property_id: nil })
6条答案
按热度按时间yhuiod9q1#
要获取所有没有用户的属性,请尝试以下操作:
字符串
t1rydlwq2#
另一种方法是写一些
SQL
:字符串
上面的代码将被转换为以下对数据库的纯
SQL
查询:型
LEFT JOIN
关键字返回左表中的所有行(properties
),匹配的行在右表中(users
)。当没有匹配时,结果是右侧的NULL
。然后WHERE
关键字通过一个条件过滤结果,即我们只对右侧有NULL
的行感兴趣。的数据
参考:SQL LEFT JOIN Keyword
ercv8c1e3#
你也可以这样做:
字符串
另一种选择是:
型
您可以根据您的应用程序检查哪一个更有效,方法是检查执行查询所需的时间并相应地选择一个选项。
vxqlmq5t4#
你也可以根据这个查询来写作用域,只是为了方便使用。
字符串
然后,您可以像这样调用此作用域:
Property.incomplete
emeijp435#
你可以试试这个查询:
字符串
或
型
fcy6dtqo6#
使用此代码:
字符串