code
代码段具有三种方法:lambda
,scope
和class method
。
它们全部返回相同的结果。
问题:
Ruby/Rails
时,在lambda
中是否有最佳实践? scope
,class
或ojit_code方法(最佳做法)。class Cars < ActiveRecord::Base
attr_accessible :manufacturer, :price, :used
#one
scope :used_and_cheap_lambda, lambda { where('used = ?', true ).where('price >= ?',30000) }
#two
scope :used_and_cheap_scope, where('used = ?', true ).where('price >= ?',30000)
#three
def self.used_and_cheap_class
where('used = ?', true ).where('price >= ?',30000)
end
end
Cars.used_and_cheap_lambda.count
=> #24
Cars.used_and_cheap_class.count
=> #24
Cars.used_and_cheap_scope.count
=> #24
最佳答案
最好避免使用选项2。该代码会在载入Rails应用程序后立即运行,这很糟糕,因为对于您在其中使用的任何Time参数,它将始终返回相同的值。那是因为它不会在每次调用时重新评估。
正如musicnerd47所指出的,选项1是延迟加载的,建议您将lambda传递给Rails 4中的范围,而不要执行选项2,因为每次调用它们都会对其进行重新评估,因此它们将返回更新的值。
因此,唯一的选择是1和3。这通常是团队所遵循的风格问题。在我们公司中,当传递给它的代码将是ActiveRecord查询并且我们希望它输出可以链接的查询时,我们使用选项1。这是为了确保每次我们查询多条记录时都返回一个ActiveRecord::Relation对象。这意味着它们将始终与其他ActiveRecord::Relation方法和我们定义的其他范围链接在一起。
如果选项3用于不需要与其他作用域链接的行为,则使用选项3。
这是有关作用域和class_methods的很好的读物,他详细介绍了作用域和类方法之间的区别,并提供了一些示例。
http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/