什么是Rails ActiveRecord find(x)方法,等效于惰性评估范围?如何重构ActiveRecord查找器?

| 模型的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-体面的曝光     

要回复问题请先登录注册