了解Eager Loading - Rails

时间:2017-02-25 16:28:46

标签: ruby-on-rails ruby

我试图理解急切加载的概念,以及比将概念直接应用到实际应用程序更好的方法。当我尝试这个时,我遇到了一个问题。我在尝试加载assignment展示页面时遇到此错误:undefined method "includes" for #<Assignment:0x007f82f6e41210>。我认为,如果你include一个关联是预加载的概念,那么你就不必多次访问数据库了?但显然我在这里做错了。任何帮助都会很棒我的代码和模型适用:

Timekeeper.rb

class Timekeeper < ApplicationRecord
  belongs_to :assignment

  validates :assignment_id, presence: true
end

Assignment.rb

class Assignment < ApplicationRecord
  validates :name, presence: true
  validates :description, presence: true

  belongs_to :account
  has_many :tasks
  has_many :assignment_relationships
  has_many :users, through: :assignment_relationships
  has_many :timekeepers

  def assigned_workers
    assignment_relationships.where(designated: true).count
  end
end

分配控制器:

  def show
    @assignment = current_account.assignments.find(params[:id]).includes(:timekeepers)
    @tasks = @assignment.tasks.all
    @task = @assignment.tasks.new
  end

另外,一旦它起作用,我将如何在视图中调用它?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

  

未定义的方法“包括”用于#&lt;分配:0x007f82f6e41210&GT;

这意味着您尝试在Assignment实例上调用包含,因为您必须将其链接到ActiveRecordCollection

您需要使用includes然后find更改方法的顺序。

def show
  @assignment = current_account.assignments.includes(:timekeepers).find(params[:id])
  @tasks = @assignment.tasks.all
  @task = @assignment.tasks.new
end

这将为您返回Assignment id = params[:id]的单个记录,并且还会急切加载所有关联的timekeepers

答案 1 :(得分:1)

您收到此错误是因为您尝试在单个对象上使用includesfind会在此语句中返回单个对象。

@assignment = current_account.assignments.find(params[:id]).includes(:timekeepers)

你可以这样做,因为where会返回一个活跃的记录关系,你可以对此进行includes。在你的情况下,你是否有必要做出决定。

@assignment = current_account.assignments.where(id: params[:id]).includes(:timekeepers)