查询Rails中关系的关系

时间:2014-06-18 21:57:21

标签: sql ruby-on-rails ruby

我正在尝试在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,然后迭代它们并在必要时删除它们。

1 个答案:

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