如何为所有ActiveRecord模型使用常见的named_scope

Gen*_*Gen 4 ruby activerecord ruby-on-rails

您好如何构建一个所有模型都常见的named_scope.

Cas*_*ius 9

我把这个代码放在lib/has_common_named_scopes.rb:

module HasCommonNamedScopes
  def self.included(base)
    base.class_eval {
      # Named scopes
      named_scope :newest, :order => "#{base.table_name}.created_at DESC"
      named_scope :freshest, :order => "#{base.table_name}.updated_at DESC"
      named_scope :limit, lambda { |limit| {:limit => limit} }
    }
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在我需要的每个模型中包含模块:

class MyModel < ActiveRecord::Base
  include HasCommonNamedScopes
Run Code Online (Sandbox Code Playgroud)

我建议您base.table_name在引用这些命名范围中的列时使用来限定表,就像我在示例中所做的那样.否则,当您将这些命名范围与其他表中连接的其他范围组合时,会遇到模糊引用的问题.

更新:

scope用于Rails> 3并named_scope在以前的版本中使用.