Ruby on rails 如何在一次调用中获取子模型(记录)?

Ruby on rails 如何在一次调用中获取子模型(记录)?,ruby-on-rails,Ruby On Rails,我正在开发Rails 3.2.6应用程序。我有一个状态模型,一个事件模型和一个照片模型 事件 Has_many :statuses 状态 Belongs_to :event Has_one :photo 照片 Belongs_to :status 我想获取属于所选事件的所有状态消息(这很好),但 我还想得到属于每个状态信息的照片。我该怎么做 这是我获取属于事件的状态消息的方式: @event = Event.find_by_id (params[:event_id]) @event.sta

我正在开发Rails 3.2.6应用程序。我有一个
状态
模型,一个
事件
模型和一个
照片
模型

事件

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}

如果您想减少查询,可以执行以下操作

@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

您可以尝试在一个查询中选择所有内容:

@event = Event.where(:id => params[:event_id]).includes(:statuses => :photo).first
请注意,如果没有链接的
first
,它将返回
ActiveRecord::Relation
的实例,而不是
事件
模型实例。那你就可以了

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


好的,注意到你关于一些状态没有照片的评论。IIRC(我现在没有办法检查这一点),
includes
将执行左连接(可能取决于底层DB适配器),返回有照片和没有照片的状态,因此,您必须根据您的目的,使用nil检查个人
状态.photo
refs或使用
compact
@photos
中筛选出nil对象,就像我上面所做的那样。

看起来不错。这是否会获得所有状态(如果有照片的话)?这就是
包含的部分的用途。它在一个查询中选择所有相关的DB字段,因此我的答案中的第二个代码段不应导致重新查询。通过合并,我的意思是状态消息及其附加的照片将合并到同一个输出对象中。并非所有状态都有照片。我是否会在同一输出对象中同时获取状态数据和照片数据@loken makwana并非所有状态都有照片。