2013-02-19 54 views
1

我有兩個模型,Invitation和RSVP。一個邀請有很多rsvps,而rsvp屬於一個邀請。我想運行一個查詢,它將返回屬於每個邀請的所有邀請和rsvps。我想擁有屬於邀請和rsvp的所有屬性。我知道包括並一直在嘗試的東西,如在Active Record中返回包含多個模型

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

但我只獲取RSVP返回的屬性。理想情況下,我希望將RSVP所屬邀請的屬性添加到結果中。我錯過了什麼概念,或者我應該如何看待這種不同的方式?

回答

3

讓我們假設Invitation模型要在查詢結果訪問兩個領域event_nameevent_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 
+0

當我運行RSVP.select(「rsvps。*,invitations.event_name invitation_event_name, invitations.event_date invitation_event_date」 ).where(user_id:3).joins(:invitation)',我沒有得到邀請字段在查詢結果中。我不知道爲什麼它不起作用。它確實返回了rsvp的所有字段。 – jason328 2013-02-19 02:45:30

+1

在控制檯中打印對象時,不顯示這些屬性。你有沒有試圖明確地訪問它們?即'rsvp.invitation_event_name' – 2013-02-19 03:16:37

+0

啊。我現在看到了。有用。爲什麼不在Rails控制檯中顯示? – jason328 2013-02-19 03:24:29

1

RSVP.where(...)帶或不帶includes(...)將返回一個RSVP對象的集合。通過包含每個RSVP所具有的:invitation關聯,您可以立即爲集合中的每個RSVP加載:invitation。這可以防止在引用它的:invitation關聯時,爲集合中的每個RSVP運行單獨的SELECT * FROM invitations WHERE ...查詢。

.includes不過是查詢優化,如果您計劃在集合中使用關聯對象。它的確如此,而不是將來自關聯的屬性合併到結果集中的模型實例中。

如果你想擁有從相關Invitation上的RSVP實例包括的屬性,你可以使用Rails的delegate方法。你可以閱讀關於它here

在你的RSVP模型上,你會做這樣的事情,從Invitation列出所需的屬性來代替我在下面留下的佔位符。現在

class RSVP < ActiveRecord::Base 

    has_one :invitation 

    delegate :some_invitation_attribute, :another_invitation_attribute, to: :invitation 

您可以直接在RSVP實例調用:some_invitation_attribute:another_invitation_attribute

@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 
+0

不幸的是,我仍然沒有收到來自查詢結果的邀請屬性。 – jason328 2013-02-19 02:29:39

相關問題