我正在尝试在Rails中创建一个查询,但是在创建正确的查询时遇到了一些麻烦。以下是我与他们的关系的模型。
class User < ActiveRecord::Base
has_and_belongs_to_many :rsvps, class_name: 'Event'
has_many :albums
end
class Event < ActiveRecord::Base
has_many :albums
has_and_belongs_to_many :attendees, class_name: 'User'
end
class Album < ActiveRecord::Base
belongs_to :user
belongs_to :event
end
我需要让用户拥有“rsvp'ed”的所有活动,因为他们尚未上传相册。我可以使用以下内容了解用户是否已将相册上传到特定事件:
u = User.find(1)
e = Event.find(1)
e.albums.where(user_id: u.id)
我希望能够在每个用户的rsvp'ed相册上运行此查询。我知道我可以这样做:
u.rsvps.delete_if { |e| !e.albums.where(user_id: u.id).blank? }
但是,我希望在一个查询中完成所有操作,而不是获取rsvps,然后迭代它们并在必要时删除它们。
答案 0 :(得分:0)
为了让所有用户都能看到但尚未上传相册的活动,您可以使用以下内容(更新)现在也可以使用当用户没有上传任何专辑时。
@event_ids = Album.where(user_id: u.id).pluck(:event_id))
@event_ids.empty? ? u.rsvps : u.rsvps.where("id not in (?)", @event_ids)
此外,此查询也应该有效。
u.rsvps.where.not(id: Album.where(user_id: u.id).pluck(:event_id))