返回包含Active Record的多个模型

时间:2013-02-19 01:29:29

标签: sql ruby-on-rails ruby-on-rails-3 rails-activerecord

我有两个型号,邀请和RSVP。邀请函有很多rsvps,rsvp属于邀请。我想运行一个查询,它将返回所有邀请和属于每个邀请的rsvps。我想拥有属于邀请和rsvp的所有属性。我知道包括并且一直在尝试像

这样的事情
@results = RSVP.where(user_id: 3).includes(:invitation)

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

2 个答案:

答案 0 :(得分: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

答案 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