Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 什么是Rails ActiveRecord find(x)方法,它等效于惰性计算范围?如何重构ActiveRecordFinder?_Ruby On Rails_Ruby_Activerecord_Refactoring - Fatal编程技术网

Ruby on rails 什么是Rails ActiveRecord find(x)方法,它等效于惰性计算范围?如何重构ActiveRecordFinder?

Ruby on rails 什么是Rails ActiveRecord find(x)方法,它等效于惰性计算范围?如何重构ActiveRecordFinder?,ruby-on-rails,ruby,activerecord,refactoring,Ruby On Rails,Ruby,Activerecord,Refactoring,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_te

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
而不是

Course.by_company_id(params[:id])
哪个是正确的?我知道
当然。by_company_id(params[:id])
只是一个数据库调用。在Hibernate中编写SQL或查询是非常熟悉的。但是如果你可以用另一种方式写,也许应该

但是,我不想编写
Company.find(params[:id]).instructors.courses
,如果它导致多个数据库调用。虽然我可以看到它的优点,因为它意味着永远不必编写我在上面向您展示的3个作用域,但我担心
Company.find(x)
并不懒惰。是吗?

在调用
\find
之前,尝试在模型上使用
\scoped
方法:

user = User.scoped.instructors.courses.find(params[:id])

要使
find
byid查询变为惰性,您可以向控制器添加新方法,然后将此方法添加为助手

# company
def company  
  @company ||= Company.find(params[:id])  
end  
helper :company

#view
<%= company.name %>
#公司
def公司
@company | |=company.find(params[:id])
结束
助手:公司
#看法

要获得更多信息,您可以查看great RailsCast-

嗯。。。可能就是我。。。但是您的查询看起来并不是做同样的事情。你是说要使用
Company.scoped.find(params[:id]).instructors.courses
?如果这是解决方案,为什么Rails团队在默认情况下不让
find(params[:id])
变懒?似乎是
。作用域
是不必要的复杂性,增加了与ActiveRecord其余部分的不一致性。我明白如果那是怎么做的。。。但这似乎是毫无理由的例外。不,我也不是这个意思。我说的是sql的延迟求值,所以整个单行查询只在一个数据库调用中进行,而不是在两个数据库调用中进行。。。或者N+1数据库调用,等等。你可以使用
includes
def company@company | |=company.includes(:讲师,:课程)。find(params[:id])end
,但是没有其他方法可以减少查询。我也不确定这是我想的。我想我在问题中提出问题的方式可能是正确的答案。也许这需要更多的工作,也没有那么漂亮,但这可能是最有效的写作方式。我认为这个问题还没有得到回答:(如果你想回答,请阅读下面的评论,看看我的意思
# company
def company  
  @company ||= Company.find(params[:id])  
end  
helper :company

#view
<%= company.name %>