gpt4 book ai didi

ruby-on-rails - 什么是等效于惰性求值范围的 Rails ActiveRecord find(x) 方法?如何重构 ActiveRecord 查找器?

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:43 24 4
gpt4 key购买 nike

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])

关于ruby-on-rails - 什么是等效于惰性求值范围的 Rails ActiveRecord find(x) 方法?如何重构 ActiveRecord 查找器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6133254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com