我有两个型号,邀请和RSVP。邀请函有很多rsvps,rsvp属于邀请。我想运行一个查询,它将返回所有邀请和属于每个邀请的rsvps。我想拥有属于邀请和rsvp的所有属性。我知道包括并且一直在尝试像
这样的事情@results = RSVP.where(user_id: 3).includes(:invitation)
但我只是返回了RSVP的属性。理想情况下,我希望将RSVP所属的邀请属性添加到结果中。我错过了什么概念,或者我应该以不同的方式思考这个概念?
答案 0 :(得分:3)
我们假设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
答案 1 :(得分:1)
RSVP.where(...)
的 includes(...)
将返回RSVP
个对象的集合。通过包含每个:invitation
所拥有的RSVP
关联,您可以一次性加载集合中每个:invitation
的{{1}}。这可以防止在您引用它的RSVP
关联时为集合中的每个SELECT * FROM invitations WHERE ...
运行单独的RSVP
查询。
:invitation
只是查询优化。 不将关联中的属性合并到结果集中的模型实例中。
如果您希望在.includes
个实例上包含关联的Invitation
的属性,则可以使用Rails RSVP
方法。您可以阅读 here 。
在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