1

招待状と RSVP の 2 つのモデルがあります。招待には多数の rsvp があり、rsvp は招待に属しています。すべての招待状と各招待状に属する rsvps を返すクエリを実行したいと考えています。招待状と rsvp の両方に属するすべての属性が必要です。私はインクルードを認識しており、次のようなことを試しています

@results = RSVP.where(user_id: 3).includes(:invitation)

しかし、返された RSVP の属性のみを取得しています。理想的には、RSVP が属する Invitation の属性を結果に追加したいと考えています。どの概念が欠けているか、またはこれを別の方法で考える必要がありますか?

4

2 に答える 2

4

Invitationモデルに 2 つのフィールドがevent_nameあり、クエリevent_date結果でアクセスしたいとします。joins句を指定すると、選択リストをカスタマイズできます。

RSVP.select("rsvps.*, invitations.event_name invitation_event_name, 
  invitations.event_date invitation_event_date"
).where(user_id: 3).joins(:invitation).each do |rsvp|    
  puts rsvp.invitation_event_name, rsvp.invitation_event_date
end
于 2013-02-19T02:05:04.767 に答える
1

RSVP.where(...)の有無にかかわらず、オブジェクトincludes(...)のコレクションを返しRSVPます。:invitationeach が持っている関連付けを含めることで、コレクション内のfor eachを一度にRSVP熱心に読み込みます。これにより、コレクションの関連付けを参照するときに、コレクション内のすべてに対して個別のクエリが実行されるのを防ぐことができます。:invitationRSVPSELECT * FROM invitations WHERE ...RSVP:invitation

.includesコレクション内のオブジェクトの関連付けを使用する予定がある場合は、クエリの最適化に他なりません。アソシエーションの属性を結果セットのモデル インスタンスにマージしません。

インスタンスに関連付けられたインクルードからの属性が必要な場合は RailsInvitationメソッドを使用できます。ここでそれについて読むことができます。RSVPdelegate

モデルでは、次のようなことを行い、以下に残したプレースホルダーの代わりにRSVP必要な属性をリストします。Invitation

class RSVP < ActiveRecord::Base

  has_one :invitation

  delegate :some_invitation_attribute, :another_invitation_attribute, to: :invitation

これで、インスタンス:some_invitation_attribute:another_invitation_attribute直接呼び出すことができます。RSVP

@results = RSVP.where(user_id: 3).includes(:invitation)
puts @results.first.some_invitation_attribute # delegates the .some_invitation_attribute method call to the associated Invitation
于 2013-02-19T01:37:32.833 に答える