2

Rails3.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

これを試して、1 つのクエリですべてを選択できます。

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

チェーンされていない場合、モデル インスタンスではなく、firstのインスタンスが返されることに注意してください。それからあなたはすることができますActiveRecord::RelationEvent

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

編集

OK は、一部のステータスに写真がないというあなたのコメントに気づきました。IIRC (現在これを確認する方法はありません)includesは LEFT JOIN を実行し (基になる DB アダプターに依存する可能性があります)、写真の有無にかかわらずステータスを返すため、個々の参照を nil-check する必要がありますstatus.photo。または、目的に応じて、上記のようにcompactnil オブジェクトを除外するために使用します。@photos

于 2012-08-17T13:24:30.477 に答える