Rails预加载关联

时间:2018-04-08 04:45:25

标签: ruby-on-rails activerecord

我无法预加载belongs_to关联。

有问题的模型有以下关联

class Order < ActiveRecord::Base
  belongs_to :user_name, -> { select(:id, :name) }, class_name: "User", :foreign_key => 'user_id'
end

上述协会正常运作并按预期结算。

我想将user.iduser.nameorder一起返回。 如何预加载关联user_name

我确实尝试Order.includes(:user_name),但没有按预期工作。

2 个答案:

答案 0 :(得分:0)

尝试添加如下所示的范围

scope : user_name_id, -> { joins(:user_name).select( 'user_names.id, user_names.name' ).collect{|c| [c.id, c.name]} }

答案 1 :(得分:0)

我会将关联更改为:

class Order < ActiveRecord::Base
  belongs_to :user
end

并在其他地方选择users.idusers.name。它使您的代码更加灵活。

  

如何预加载关联

ActiveRecord提供了几种方法:

  1. Preload。在单独的查询中加载关联数据。以来 preload总是生成两个sql,你不能使用预加载的表 条件。
  2. Includes。默认情况下,加载关联数据 一个单独的查询就像preload一样。但附加references 叫它切换使用两个单独的查询来创建一个 单LEFT OUTER JOIN。因此,您可以在where condition中使用关联表。
  3. Eager load。使用LEFT OUTER JOIN在单个查询中加载关联。
  4. 以下是一些有用的文章:

    Preload, Eagerload, Includes and Joins

    Making sense of ActiveRecord joins, includes, preload, and eager_load