ruby-on-rails – Rails:lambda,scope和class方法有什么区别?最好的做法是什么?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails:lambda,scope和class方法有什么区别?最好的做法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
代码片段有三种方法: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/

猜你在找的Ruby相关文章