我有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的专辑 然后我找到一个列出的专辑并要求它返回关联的用户 其中一个相关用户是上面的那个,不应该在那里。
任何人都可以帮助解决上述问题吗?
答案 0 :(得分:7)
我通常会试图远离小选,但我似乎无法以任何其他方式工作:
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)
答案 1 :(得分:2)
假设您创建了table albums_users来保存关系数据:
Album.includes(:users).
where(["albums_users.user_id IS NULL OR albums_users.user_id != ?", user_id])
我认为它将按照
的顺序生成SQLSELECT *
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}
答案 2 :(得分:1)
尝试:
:conditions => ["users.id <> ? AND users.id IS NOT NULL", current_user.id]
答案 3 :(得分:-1)
非sql解决方案是:
Album.all.reject{|album| user.albums.include?(album)}
显然,如果数据库中有数万行,您可能不想这样做。
也可以做这样的事情:
Album.where(["id NOT IN (?)", user.albums_ids])
但是如果你的用户有很多(比如几百张)专辑,你也不应该这样做。
如果你出去参加其中一个,只需要提供简单的解决方案。