繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM