2014-06-18 37 views
0

我想在Rails中创建一个查询,但是在创建正确的查询时遇到了一些麻烦。下面是我的模型与他们的关系。查询关系在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? } 

不过,我要做到这一切在一个查询,而不是得到回函,然后遍历它们并删除它们在必要时。

回答

0

为了让用户已rsvp'ed到但尚未上传的相册又所有事件,您可以使用下面的,它(UPDATE)现在也工作在用户还没有上传过任何相册。

@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)) 
+0

我很欣赏这个答案,但是我正在寻找一种方法来获取他们被rsvp的事件,他们没有上传相册。我现在不关心这些专辑。 – searsaw

+0

哦拍摄,对不起,我完全误读了这个问题。我用一个解决方案更新了我的答案,该解决方案应该适用于您实际需要的内容。 –

+0

上述唯一的问题是当'Albums.where(user_id:u.id).pluck(:event_id)'返回一个空数组时,它返回一个空。它应该返回所有的rsvps。 – searsaw