【发布时间】:2014-05-30 15:22:41
【问题描述】:
我希望在单个 sql 查询中查询所有没有评论的用户?
型号:
class User < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :user
end
所以我想要相反的:
User.joins.(:comments).group('users.id')
但不是这样:(因为它会生成两个查询)
User.where.not(id: Comment.pluck(:user_id))
也许是这样的?
User.joins.not.(:comments).group('users.id')
感谢您的任何意见!
【问题讨论】:
-
试试
User.includes(:comments).where(comments: { id: nil }) -
@MrYoshiji 这太棒了,比公认的答案更正确。谢谢。
-
注意:在 Rails 6.1 中,您可以只使用
User.where.missing( :comments )。请参阅edgeapi.rubyonrails.org/classes/ActiveRecord/QueryMethods/… 和这个 SO 答案stackoverflow.com/a/5570221/293280。 -
虽然@MrYoshiji 提出的解决方案可能有效(如果包含在内部使用 eager_load 处理),但不能保证有效。如果 AR 执行预加载,则不会发生连接,查询将失败。如果您需要进行连接,请使用连接(或在现代 rails left_outer_joins 上)。
标签: sql ruby-on-rails activerecord ruby-on-rails-4