保持named_scope扩展DRY

时间:2010-02-04 00:37:48

标签: ruby-on-rails named-scope

在Rails中,您可以在named_scope之后添加一个块,用于其他上下文相关的方法,如下所示:

class User < ActiveRecord::Base
  named_scope :inactive, :conditions => {:active => false} do
    def activate
      each { |i| i.update_attribute(:active, true) }
    end
  end
end

在此示例中,activate方法不是在User类上定义,而是在ActiveRecord::NamedScope::Scope对象上定义。

我有一系列需要具有相同方法定义的三个范围。为了不重复代码,我如何抽象该块,以便我可以定义它一次并将其传递给每个named_scope

2 个答案:

答案 0 :(得分:2)

首先,很好的问题 - 我不知道命名范围的这个特征!以下适用于我:

class User < ActiveRecord::Base
  add_activate = lambda do
    define_method "activate" do
      each { |i| i.update_attribute(:active, true) }
    end
  end

  named_scope :inactive, :conditions => {:active => false}, &add_activate
end

您可以将add_activate块作为最后一个参数传递给任何需要activate方法的命名范围。

答案 1 :(得分:0)

好多了:

http://tuxicity.se/rails/dry/2009/01/04/share-named-scopes-in-rails.html

module NamedScope
  def self.included(base)
    base.class_eval do
      named_scope :inactive, :conditions => {:active => false} do
        def activate
          each { |i| i.update_attribute(:active, true) }
        end
      end
    end
  end
end

保存在您的/lib目录中(在rails 3中的初始值设定项中添加了一个require)和include NamedScope类中的User