所以我有一個職位和用戶。
發佈has_many用戶和用戶belongs_to帖子。
我需要一個發現,會發現所有不具有像下面的任何用戶的帖子:找到所有在協會無零
Post.first.users
=> []
所以我有一個職位和用戶。
發佈has_many用戶和用戶belongs_to帖子。
我需要一個發現,會發現所有不具有像下面的任何用戶的帖子:找到所有在協會無零
Post.first.users
=> []
Post.where("id not in (select post_id from users)")
Post.first.users.empty?
應該是足夠的,如果用戶返回數組。
如果你要檢查每一個職位,你可以做
Post.each do |p|
if p.users.empty?
do whatever
end
end
如果你需要的東西是速度快,使用像SQL語句:
SELECT *
FROM posts p
LEFT OUTER JOIN users u ON p.id = u.post_id
WHERE u.id IS null
我想一個sql如果數據庫表有很多行,則in會導致性能問題。小心這一點
類似的東西:
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)
我知道這是標記爲Rails 3中,但如果你是使用Rails 4,我一直在做這樣的。
Post.where.not(user_id: User.pluck(:id))
今天剛剛得知這一個:
Post.eager_load(:users).merge(User.where(id: nil))
工程使用Rails 4+至少。
更新:
在Rails 5+,您可以使用left_joins
代替:
Post.left_joins(:users).merge(User.where(id: nil))
我需要找到所有的帖子...不只是第一 – Trace 2011-02-09 16:47:50
,所以我需要這樣的東西Post.all (:include =>:users,:conditions =>「users =?」,nil) – Trace 2011-02-09 16:48:44
`Post.each do | p |如果p.users == nil做任何結束' – acconrad 2011-02-09 16:50:40