code代码段具有三种方法:lambdascopeclass method

它们全部返回相同的结果。

问题:

  • 当首选使用Ruby/Rails时,在lambda中是否有最佳实践?
  • 在什么情况下,您将使用scopeclass或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/

    10-08 07:19
    查看更多