所以我有一个帖子和一个用户 发布has_many用户,用户发布帖子 我需要一个能够找到所有没有任何用户的帖子的发现,如下所示:
Post.first.users
=> []
答案 0 :(得分:27)
Post.where("id not in (select post_id from users)")
答案 1 :(得分:17)
今天就学会了这个:
Post.eager_load(:users).merge(User.where(id: nil))
至少使用Rails 4+。
更新
在Rails 5+中,您可以改为使用left_joins
:
Post.left_joins(:users).merge(User.where(id: nil))
答案 2 :(得分:2)
如果您需要快速的东西,请使用以下SQL语句:
SELECT *
FROM posts p
LEFT OUTER JOIN users u ON p.id = u.post_id
WHERE u.id IS null
答案 3 :(得分:2)
类似的东西:
p = Post.arel_table
u = User.arel_table
posts = Post.find_by_sql(p.join(u).on(p[:user_id].eq(u[:p_id])).where(u[:id].eq(nil)).to_sql)
答案 4 :(得分:2)
我知道这被标记为Rails 3,但如果你使用的是Rails 4,我就是这样做的。
Post.where.not(user_id: User.pluck(:id))
答案 5 :(得分:1)
Post.first.users.empty?
就足够了。
如果你想查看你可以做的每篇文章
Post.each do |p|
if p.users.empty?
do whatever
end
end
答案 6 :(得分:1)
我猜如果数据库表有很多行,带有in的sql会导致性能问题。小心那个