在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
?
答案 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