我有两个模型,邀请和回复。一个邀请有多个 rsvps,而 rsvp 属于一个邀请。我想运行一个查询,该查询将返回所有邀请以及属于每个邀请的 rsvps。我想拥有属于邀请和 rsvp 的所有属性。我知道包含并一直在尝试诸如
@results = RSVP.where(user_id: 3).includes(:invitation)
但我只返回了 RSVP 的属性。理想情况下,我希望将 RSVP 所属的邀请属性添加到结果中。我错过了什么概念,或者我应该以不同的方式思考这个问题?
我有两个模型,邀请和回复。一个邀请有多个 rsvps,而 rsvp 属于一个邀请。我想运行一个查询,该查询将返回所有邀请以及属于每个邀请的 rsvps。我想拥有属于邀请和 rsvp 的所有属性。我知道包含并一直在尝试诸如
@results = RSVP.where(user_id: 3).includes(:invitation)
但我只返回了 RSVP 的属性。理想情况下,我希望将 RSVP 所属的邀请属性添加到结果中。我错过了什么概念,或者我应该以不同的方式思考这个问题?
让我们假设Invitation
模型有两个字段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
RSVP.where(...)
有或没有includes(...)
将返回一个RSVP
对象的集合。通过包含:invitation
eachRSVP
具有的关联,您可以一次急切地加载集合中:invitation
的每个RSVP
。当您引用它的关联时,这可以防止为集合中的每个运行单独的SELECT * FROM invitations WHERE ...
查询。RSVP
:invitation
.includes
如果您计划对集合中的对象使用关联,那只不过是一种查询优化。它不会将关联中的属性合并到结果集中的模型实例中。
如果你想将一个属性从关联的实例中Invitation
包含进来,你可以使用 Rails方法。你可以在这里阅读。RSVP
delegate
在你的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