Ruby on rails 如何在一次调用中获取子模型(记录)?
我正在开发Rails 3.2.6应用程序。我有一个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
状态
模型,一个事件
模型和一个照片
模型
事件
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并非所有状态都有照片。