gpt4 book ai didi

ruby-on-rails - 获取 Rails 中某个模型类型的所有记录的所有关联数据?

转载 作者:行者123 更新时间:2023-12-04 03:45:53 25 4
gpt4 key购买 nike

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

我有以下型号:

User --N:1--> Reservation <--1:N-- Concert

所以伪代码:
Reservation belongs_to User
Reservation belongs_to Concert
User has_many Reservations
User has_many Concerts through Reservations
Concert has_many Reservations
Concert has_many Users through Reservations

我如何制作一个包含所有内容的大数组?
  • 我可以通过 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 条记录,这可能无关紧要,但对于数千条记录,可能会非常痛苦。添加其他关联(例如音乐会所属 field 、用户拥有_一个电子邮件等)...

    有什么办法可以说“获取所有预订和以下附加信息”,以便在单个 SQL 查询中加载?

    最佳答案

    您要完成的操作称为预先加载,可以使用 includes 完成。在 ActiveRecord .见下文:

    N + 1 queries problem

    Active Record lets you specify in advance all the associations that are going to be loaded. This is possible by specifying the includes method of the Model.find call. With includes, Active Record ensures that all of the specified associations are loaded using the minimum possible number of queries.


    http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
    在您的示例中,您可以使用以下内容:
    Reservation.all.includes(:user, :concert)

    指定 :inverse_of 也是一个好主意。您的 :belongs_to 的选项关系。这优化了对象加载并确保交叉引用模型将指向内存中的同一对象,即:
    @user == @user.reservations.first.user # true
    此处提供更多信息:

    If you are using a belongs_to on the join model, it is a good idea to set the :inverse_of option on the belongs_to ...


    http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
    在你的例子中:
    # app/models/reservation.rb

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

    关于ruby-on-rails - 获取 Rails 中某个模型类型的所有记录的所有关联数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875055/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com