Rails:lambda,scope和class方法有什么区别?什么是最佳做法?

13 ruby methods ruby-on-rails

code片段有三个方法:lambda,scopeclass method.

所有这些都返回相同的结果.

问题:

  1. Ruby/Rails当首选使用一个而不是另一个时,是否有最佳实践?
  2. 在什么情况下,你会使用lambda,scopeclass方法(最佳实践).

    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
    
    Run Code Online (Sandbox Code Playgroud)

Gja*_*don 5

最好避免使用选项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/