Ruby on rails 什么是Rails ActiveRecord find(x)方法,它等效于惰性计算范围?如何重构ActiveRecordFinder?
Rails在模型上的find(x)方法是懒惰的吗?如果不是,那么等价物是什么 我是Rails的新手,因此我发现自己编写的范围如下: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
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 %>