2010-02-04 66 views
2

在Rails,可以将named_scope额外,上下文敏感的方法,像这样后添加块:保持named_scope扩展DRY

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

首先,一个很好的问题 - 我不知道命名示波器的功能!对我来说,以下工作:

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方法的任何命名范围。

+0

谢谢!我忘了'&'。知道这是简单的事情。 – 2010-02-04 01:10:01