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 然后我找到一个列出的专辑,并要求它返回相关用户 其中一个关联用户是上面的一个,不应该在那里。
任何人都可以帮助上述吗?
我通常会尽量远离子选择,但我似乎无法得到它的工作任何其他方式:
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)
尝试:
:conditions => ["users.id <> ? AND users.id IS NOT NULL", current_user.id]
感谢您的帮助。不幸的是没有运气,这并没有改变结果。它仍然返回一些相册,当我检查他们的关联用户时,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}
感谢您的回复,但这并不适合我。 – 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])
但是如果你的用户有专辑的很多(说上百个),你不应该这样做无论是。
只要投入简单的解决方案,如果你出去的人之一。
是的,他们是很好的简单的解决方案,我会为他们为v1,但正如你所说那里不是很大,当有很多行,这是真的在我的情况。 – robodisco 2011-03-26 07:39:40
效率不高 – 2013-06-07 16:09:51
@robodisco:这不适合你吗?这里有不清楚的地方吗? Imho这是最好的答案。 – nathanvda 2011-03-20 19:16:11
对于迟到的回复感到抱歉 - 我住在日本,最近的地震和辐射恐惧有点破坏性。感谢您的帮助。我已经把你的标记作为选择的答案 - 我假设你的奖金是你的,尽管我确定我指定了50而不是显示的25。 – robodisco 2011-03-26 07:37:32
quoted_table_name还指什么? – robodisco 2011-03-26 07:37:55