我试图理解急切加载的概念,以及比将概念直接应用到实际应用程序更好的方法。当我尝试这个时,我遇到了一个问题。我在尝试加载assignment
展示页面时遇到此错误:undefined method "includes" for #<Assignment:0x007f82f6e41210>
。我认为,如果你include
一个关联是预加载的概念,那么你就不必多次访问数据库了?但显然我在这里做错了。任何帮助都会很棒我的代码和模型适用:
class Timekeeper < ApplicationRecord
belongs_to :assignment
validates :assignment_id, presence: true
end
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
另外,一旦它起作用,我将如何在视图中调用它?谢谢你的帮助。
答案 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)
您收到此错误是因为您尝试在单个对象上使用includes
,find
会在此语句中返回单个对象。
@assignment = current_account.assignments.find(params[:id]).includes(:timekeepers)
你可以这样做,因为where
会返回一个活跃的记录关系,你可以对此进行includes
。在你的情况下,你是否有必要做出决定。
@assignment = current_account.assignments.where(id: params[:id]).includes(:timekeepers)