Rails的HABTM查询WHERE条件基于关联属性

问题描述:

我有HABTM关系用户和相册模式Rails的HABTM查询WHERE条件基于关联属性

class Album < ActiveRecord::Base 
    has_and_belongs_to_many :users 

class User < ActiveRecord::Base 
    has_and_belongs_to_many(:albums) 

我想找到的所有存储在数据库中,但不与特定相关的相册用户。

到目前为止,我的代码是这样的:

Album.all(:order => "albums.created_at DESC", :include => "users", :limit => limit, :conditions => ["users.id != ? AND users.id IS NOT NULL", current_user.id])

,但由于某种原因,这是行不通的。它返回与current_user关联的相册。

这里来看看这个从控制台ouptput。 检查用户ID我第一次获取。 然后,我找到的专辑不应该有用户ID 然后我找到一个列出的专辑,并要求它返回相关用户 其中一个关联用户是上面的一个,不应该在那里。 enter image description here

任何人都可以帮助上述吗?

我通常会尽量远离子选择,但我似乎无法得到它的工作任何其他方式:

class Album < ActiveRecord::Base 

    scope :without_user, lambda{|u| where("#{quoted_table_name}.id NOT IN (SELECT `albums_users`.album_id FROM `albums_users` WHERE `albums_users`.user_id = ?)", u.id) } 

end 

user = User.find(30) 
Album.without_user(user) 
+0

@robodisco:这不适合你吗?这里有不清楚的地方吗? Imho这是最好的答案。 – nathanvda 2011-03-20 19:16:11

+3

对于迟到的回复感到抱歉 - 我住在日本,最近的地震和辐射恐惧有点破坏性。感谢您的帮助。我已经把你的标记作为选择的答案 - 我假设你的奖金是你的,尽管我确定我指定了50而不是显示的25。 – robodisco 2011-03-26 07:37:32

+0

quoted_table_name还指什么? – robodisco 2011-03-26 07:37:55

尝试:

:conditions => ["users.id <> ? AND users.id IS NOT NULL", current_user.id] 
+0

感谢您的帮助。不幸的是没有运气,这并没有改变结果。它仍然返回一些相册,当我检查他们的关联用户时,current_user出现。 – robodisco 2011-03-12 10:37:02

假设你创建的表albums_users持有关系数据:

Album.includes(:users). 
    where(["albums_users.user_id IS NULL OR albums_users.user_id != ?", user_id]) 

我认为这将产生沿

SELECT * 
FROM albums LEFT OUTER JOIN albums_users ON albums.id = albums_users.album_id 
WHERE albums_users.album_id IS NULL OR albums_users.album_id != #{user_id} 
+0

感谢您的回复,但这并不适合我。 – robodisco 2011-03-26 07:38:18

一个非行SQL sql解决方案将是:

Album.all.reject{|album| user.albums.include?(album)} 

显然,如果你的数据库中有成千上万行,你可能不想这样做。

可能会做这样的事情,太:

Album.where(["id NOT IN (?)", user.albums_ids]) 

但是如果你的用户有专辑的很多(说上百个),你不应该这样做无论是。

只要投入简单的解决方案,如果你出去的人之一。

+0

是的,他们是很好的简单的解决方案,我会为他们为v1,但正如你所说那里不是很大,当有很多行,这是真的在我的情况。 – robodisco 2011-03-26 07:39:40

+0

效率不高 – 2013-06-07 16:09:51