问题描述
|
模型的Rails的find(x)方法是惰性的吗?如果不是,那是什么等价?
我是Rails的新手,所以发现自己正在编写如下范围:
class Course < ActiveRecord::Base
scope :by_instructor_id,lambda { |instructor_id| where(:instructor_id => instructor_id) }
scope :by_course_template_id,lambda { |course_template_id| where(:course_template_id => course_template_id ) }
scope :by_company_id,lambda { |company_id| joins(:instructor).merge(CompanyUser.by_company_id(company_id)) }
end
它的工作量不大,但是现在我要问自己...如果Rails为它们提供了作用域,则不必编写它们。
那么,Rails提供它们吗?我可以执行以下代码,仅使其执行1次数据库调用吗?
Company.find(params[:id]).instructors.courses
代替
Course.by_company_id(params[:id])
哪个是对的?我知道Course.by_company_id(params[:id])
只是1个数据库调用。在Hibernate中编写sql或查询非常熟悉。但是,如果您可以用其他方式写它,也许应该?
但是,如果导致超过1个数据库调用,我不想写Company.find(params[:id]).instructors.courses
。我可以看到优点,因为它意味着不必编写上面显示的3个作用域,但是我担心Company.find(x)
不会偷懒。是吗?
解决方法
在调用
#find
之前,请尝试在模型上使用#scoped
方法:
user = User.scoped.instructors.courses.find(params[:id])
,要通过id查询使“ 9”变懒,可以将新方法添加到控制器中,然后将该方法添加为辅助方法。
# company
def company
@company ||= Company.find(params[:id])
end
helper :company
#view
<%= company.name %>
要获取更多信息,您可以查看出色的RailsCast-体面的曝光