2012-08-17 62 views
2

我正在使用Rails 3.2.6应用程序。我有一个Status模型,一个Event模型和一个Photo模型。如何在一次通话中获取儿童模型(记录)?

事件

Has_many :statuses 

状态

Belongs_to :event 
Has_one :photo 

照片

Belongs_to :status 

我想获得的所有状态消息属于一个选定的事件(这工作正常),但 我也想得到属于每个状态消息的照片。我怎样才能做到这一点?

这是我如何得到属于一个事件的状态消息:

@event = Event.find_by_id (params[:event_id]) 
@event.statuses 

我怎样才能得到每个状态消息相关的照片输出? 我已经开始了,我想我应该这样做?但那只能得到 的照片,并不会将它们与相应的状态消息“合并”。

@photos = @event.statuses.collect {|status| status.photo} 
+0

你是什么意思与合并? – Lichtamberg 2012-08-17 13:22:16

+0

合并我的意思是状态信息及其附加的照片将被合并到同一个输出对象中。并非所有状态都有照片。 – 2012-08-17 14:03:11

回答

5

如果你想减少查询,你可以这样做下面

@statuses = Status.where(:event_id=>params[:event_id]).includes(:photo).all 

,那么你就可以像这样访问

@statuses.each do |status| 
    status.event_id # access the status 
    status.photo # access the photo 
    # status.nil? will check whether photo is there or not 
end 
+0

我会在同一个输出对象中同时获取状态数据和照片数据吗? @loken makwana并非所有状态都有照片。 – 2012-08-17 14:04:31

3

您可以尝试在这个选择的一切一个查询:

@event = Event.where(:id => params[:event_id]).includes(:statuses => :photo).first 

请注意,如果没有链接first,它将返回ActiveRecord::Relation的实例,而不是Event模型实例。然后,你可以做

@photos = @event.statuses.map(&:photo).compact 

编辑

OK注意到你对没有照片的一些状态的评论。 IIRC(我现在没有办法检查此问题),includes将执行LEFT JOIN(可能取决于底层的数据库适配器),返回包含和不包含照片的状态,因此您必须对个别进行无核查status.photo参考或使用compact来筛选从@photos无零件对象,如上所述,这取决于您的目的。

+0

看起来不错。这将获得所有状态(如果有照片的话)? – 2012-08-17 14:00:31

+0

这是'includes'部分的用途。它在一个查询中选择所有相关的数据库字段,所以我的答案中的第二个代码片段不应该导致查询。 – HargrimmTheBleak 2012-08-17 14:05:04