1

我有两个模型,邀请和回复。一个邀请有多个 rsvps,而 rsvp 属于一个邀请。我想运行一个查询,该查询将返回所有邀请以及属于每个邀请的 rsvps。我想拥有属于邀请和 rsvp 的所有属性。我知道包含并一直在尝试诸如

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

但我只返回了 RSVP 的属性。理想情况下,我希望将 RSVP 所属的邀请属性添加到结果中。我错过了什么概念,或者我应该以不同的方式思考这个问题?

4

2 回答 2

4

让我们假设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
于 2013-02-19T02:05:04.767 回答
1

RSVP.where(...)有或没有includes(...)将返回一个RSVP对象的集合。通过包含:invitationeachRSVP具有的关联,您可以一次急切地加载集合中:invitation的每个RSVP。当您引用它的关联时,这可以防止为集合中的每个运行单独的SELECT * FROM invitations WHERE ...查询。RSVP:invitation

.includes如果您计划对集合中的对象使用关联,那只不过是一种查询优化。它不会关联中的属性合并到结果集中的模型实例中。

如果你想将一个属性从关联实例中Invitation包含进来,你可以使用 Rails方法。你可以在这里阅读。RSVPdelegate

在你的RSVP模型上,你会做这样的事情,列出所需的属性来Invitation代替我在下面留下的占位符。

class RSVP < ActiveRecord::Base

  has_one :invitation

  delegate :some_invitation_attribute, :another_invitation_attribute, to: :invitation

现在您可以直接在实例上调用:some_invitation_attribute和。:another_invitation_attributeRSVP

@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 回答