Ruby on rails 获取Rails中模型类型的所有记录的所有关联数据?

Ruby on rails 获取Rails中模型类型的所有记录的所有关联数据?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,如何将给定模型的所有记录的所有相关数据融合在一起 我有以下型号: User --N:1--> Reservation <--1:N-- Concert 我如何制作一个大数组 我可以通过Reservation.all 我可以通过Reservation.find(25).User 我可以通过Reservation.find(25).Concert 但是我怎么才能为他们所有人都买呢?如果我这样做 Reservation.all.each do |res| res.user.na

如何将给定模型的所有记录的所有相关数据融合在一起

我有以下型号:

User --N:1--> Reservation <--1:N-- Concert
我如何制作一个大数组

  • 我可以通过
    Reservation.all
  • 我可以通过
    Reservation.find(25).User
  • 我可以通过
    Reservation.find(25).Concert
但是我怎么才能为他们所有人都买呢?如果我这样做

Reservation.all.each do |res|
   res.user.name+","+res.concert.name+","+res.concert.date # etc.
end
然后,当它循环通过时,它将为每个预订执行两个新的数据库查询。对于10张唱片来说,这可能无关紧要,但对于数千张唱片来说,这可能是非常痛苦的。添加其他关联(例如音乐会属于会场,用户有一封电子邮件等)


有没有办法说“获取所有预订和以下附加信息”以便它在一个SQL查询中加载?

您试图完成的任务称为即时加载,可以使用
ActiveRecord
中的
includes
完成。见下文:

N+1查询问题

活动记录允许您提前指定要加载的所有关联。这可以通过指定Model.find调用的includes方法实现。使用includes,Active Record确保使用尽可能少的查询数加载所有指定的关联

在您的示例中,您可以使用以下内容:

Reservation.all.includes(:user, :concert)

为您的
:bellings\u to
关系指定
:inverse\u of
选项也是一个好主意。这将优化对象加载,并确保交叉引用模型将指向内存中的同一对象,即:

@user == @user.reservations.first.user # true
更多信息请参见:

如果在联接模型上使用的是“属于”,则最好在“属于”模型上设置“反向”选项

在您的示例中:

# app/models/reservation.rb

belongs_to :user, :inverse_of => :reservations
belongs_to :concert, :inverse_of => :reservations

啊!!我曾在其他ORM中使用过渴望加载,我知道Rails有渴望加载,但我不知道我可以在每个请求的基础上使用它!因此,如果我执行
Reservation.all.includes(:user,:concert)
操作,它将执行选择操作,并将它们全部加入到一个join中?@deitch:Yes。您可以在控制台中尝试,并比较两者之间正在执行的SQL。哈!这正是我所做的。谢谢,德伦米。省去了我很多头痛!
# app/models/reservation.rb

belongs_to :user, :inverse_of => :reservations
belongs_to :concert, :inverse_of => :reservations