[ruby on rails] has_one,has_many关系里有order排序,使用includes的坑

  • 错误使用
class Order < ApplicationRecord
  has_many :back_order_line_items, dependent: :destroy
  has_one :last_back_order_line_item, -> { order(id: :desc).limit(1) }, class_name: 'BackOrderLineItem', foreign_key: 'order_id'
  has_many :back_orders, through: :back_order_line_items, foreign_key: 'order_id'
  has_many :present_back_orders, -> { present.limit(1) }, through: :back_order_line_items, class_name: 'BackOrder', source: 'back_order', foreign_key: 'order_id'
  has_one :bidder, -> { where('bidders.original_id IS NULL').limit(1) }
  has_and_belongs_to_many :latest_valid_after_sale_services, -> { where('after_sale_services.status >= ?', AfterSaleService.statuses['initial']).order(id: :desc).limit(1) }, class_name: 'AfterSaleService'
end
  • 正确用法,lambda里不要使用limit
class Order < ApplicationRecord
  has_many :back_order_line_items, dependent: :destroy
  has_one :last_back_order_line_item, -> { order(id: :desc) }, class_name: 'BackOrderLineItem', foreign_key: 'order_id'
  has_many :back_orders, through: :back_order_line_items, foreign_key: 'order_id'
  has_many :present_back_orders, -> { present.order(id: :desc) }, through: :back_order_line_items, class_name: 'BackOrder', source: 'back_order', foreign_key: 'order_id'
  has_one :bidder, -> { where('bidders.original_id IS NULL') }
  has_and_belongs_to_many :latest_valid_after_sale_services, -> { where('after_sale_services.status >= ?', AfterSaleService.statuses['initial']).order(id: :desc) }, class_name: 'AfterSaleService'
end
  • lambda里如果有order排序,如 has_one :last_back_order_line_item , 使用preload 不要用includes, 不要用eager_load ,会把lambda里的order排序忽略掉
Order.preload(:last_back_order_line_item, :present_back_orders) 

然后order.present_back_orders.first 就不会有N+1的问题

你可能感兴趣的:(ruby,on,rails,java,前端)