Хранение named_scope Расширения DRY - PullRequest
2 голосов
/ 04 февраля 2010

В 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 class, но для объекта ActiveRecord::NamedScope::Scope.

У меня есть серия из трех областей, которые должны иметь идентичные определения методов.В интересах не повторения кода, как бы я абстрагировал этот блок так, чтобы я мог определить его один раз и передать его каждому named_scope?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

Во-первых, отличный вопрос - я не знал об этой особенности именованных областей!Для меня работает следующее:

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 голосов
/ 02 марта 2011

Намного лучше:

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 (поместите требование в инициализаторах в рельсах 3) и include NamedScope в вашем User класс

...