【问题标题】:rails includes query loading entire data for included modelsrails 包括为包含的模型加载整个数据的查询
【发布时间】:2026-01-16 01:55:01
【问题描述】:

我有一个 Rails 应用程序,其中有以下模型。

BookingHotel
    has_many :hotel_picture_partners, through: :hotel_pictures
    has_many :booking_hotel_partner_details, dependent: :destroy

BookingHotelPartnerDetail
    belongs_to :booking_hotel

HotelPicturePartner
    belongs_to :hotel_picture, dependent: :destroy

我有一个查询如下

@booking_hotel_partner_details = BookingHotelPartnerDetail.unscoped.select(:id, :booking_hotel_id, :partner_booking_hotel_id).includes(booking_hotel: :hotel_picture_partners) 

这会给内存带来压力,因为它会加载包含模型的所有数据。

有没有办法只能从 booking_hotels 和 hotel_picture_partners 表中加载选择性字段?

我还想得到一个 activerecord 数组作为响应。

【问题讨论】:

标签: mysql ruby-on-rails


【解决方案1】:

pluck 方法只加载属性,不加载整个模型。检查它:http://apidock.com/rails/ActiveRecord/Calculations/pluck

尝试像这样重写它: BookingHotelPartnerDetail.unscoped.select('booking_hotels.id as bh_id', 'hotel_picture_partners.id as hpp_id').joins(booking_hotel: :hotel_picture_partners)

【讨论】:

  • 我想加载包含的模型,但 pluck 会给我一个数组
  • 这似乎是正确的安德烈。这不会加载内存中的所有关联记录吧?
  • Raman M,它不会急于加载它,对,你可以在 Rails 日志中查看这个 AR 查询生成的 SQL 查询。