Сохранение именованных расширений области действия в сухом состоянии
В 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 ответа:
Во-первых, отличный вопрос-я не знал об этой особенности именованных областей! Для меня работает следующее:
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.
Гораздо лучше:
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) иinclude NamedScopeв вашем классеUser