代码片段有三种方法:lambda,scope和class方法.
所有这些都返回相同的结果.
问题:
> Ruby / Rails中有哪些优先使用一种?
>在什么情况下您将使用lambda,scope或class方法(最佳做法).
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 = ?',30000) #three def self.used_and_cheap_class where('used = ?',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参数返回相同的值.这是因为它每次调用时都不会被重新评估.
选择1,如musicnerd47所指出的,它们是懒惰的,并且建议您将Lambdas传递给Rails 4中的范围,而不是执行选项2,因为每次调用它们都将被重新评估,因此它们将返回更新的值.
所以唯一的选择是1和3.这通常是你的团队坚持的风格问题.在我们公司,我们使用选项1,当我们传递给它的代码将是一个ActiveRecord查询,我们希望它输出一个可以链接的查询.这是为了确保每次对多个记录进行查询时都会返回一个ActiveRecord :: Relation对象.这意味着它们总是可以与其他ActiveRecord :: Relation方法和我们其他定义的范围链接.
如果用于不需要与其他范围链接的行为,则使用选项3.
以下是对范围和class_methods的详细介绍,他详细介绍了范围和类方法之间的区别.
http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/