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}
4

2 回答 2

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
于 2012-08-17T13:23:13.817 回答
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(可能取决于底层数据库适配器),返回带有和不带照片的状态,因此您必须要么 nil-check 单个status.photorefs或用于像我上面所做的那样compact过滤掉 nil 对象@photos,具体取决于您的目的。

于 2012-08-17T13:24:30.477 回答