[英]Rails HABTM query where condition is based on association attribute
我有具有HABTM关系的用户和专辑模型
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关联的相册。
这里从控制台看这个输出。 检查我第一次获取的用户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)
假设您创建了表albums_users来保存关系数据:
Album.includes(:users).
where(["albums_users.user_id IS NULL OR albums_users.user_id != ?", user_id])
我认为它将按照以下方式生成SQL
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}
尝试:
:conditions => ["users.id <> ? AND users.id IS NOT NULL", current_user.id]
非SQL解决方案是:
Album.all.reject{|album| user.albums.include?(album)}
显然,如果数据库中有成千上万的行,则可能不希望这样做。
也可能会执行以下操作:
Album.where(["id NOT IN (?)", user.albums_ids])
但是,如果您的用户有很多(例如数百张)专辑,您也不应这样做。
如果您想使用其中一种解决方案,只需提供简单的解决方案即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.