找到协会中的所有内容

时间:2011-02-09 16:43:04

标签: ruby-on-rails ruby-on-rails-3

所以我有一个帖子和一个用户 发布has_many用户,用户发布帖子 我需要一个能够找到所有没有任何用户的帖子的发现,如下所示:

Post.first.users
 => [] 

7 个答案:

答案 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会导致性能问题。小心那个