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

时间:2011-03-12 03:52:07

标签: ruby-on-rails activerecord has-and-belongs-to-many

我有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的专辑 然后我找到一个列出的专辑并要求它返回关联的用户 其中一个相关用户是上面的那个,不应该在那里。 enter image description here

任何人都可以帮助解决上述问题吗?

4 个答案:

答案 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])

我认为它将按照

的顺序生成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}  

答案 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])

但是如果你的用户有很多(比如几百张)专辑,你也不应该这样做。

如果你出去参加其中一个,只需要提供简单的解决方案。