Расширить существующий атрибут getter в модели rails - PullRequest
1 голос
/ 12 января 2010

У меня проблема с использованием плагинов acts_as_textiled и has_foreign_language.

TextElement моя модель в моем приложении

class TextElement < ActiveRecord::Base
    has_foreign_language :value
    acts_as_textiled :value

HasForeignLanguage

def has_foreign_language(*args)
    args.each do |field|
        # Define the Getter
        define_method(field.to_s) do
        .
        .
        .

ActsAsTextiled

def acts_as_textiled(*attributes)
.
.
.
  attributes.each do |attribute|
    define_method(attribute) do |*type|
.
.
.

В обоих плагинах используется define_method, и в любом случае я называю миксины в TextElement, последний переопределяет ранее определенный метод получения.

Есть ли способ сохранить существующий метод получения и вызвать его во вновь определенном методе получения? похоже на использование супер, если они были унаследованы.

Я раздвоил эти плагины, так что там все честно.

Вся помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 13 января 2010

Либо вы можете переписать эти два с помощью alias_method_chain.

def some_class_method_that_overrides(*columns)
  columns.each do | c |
    overriden_name = if instance_methods.include?(c)
      alias_method_chain(c.to_sym, "extra")
      "#{c}_with_extra"
    else
      c
    end
    define_method(overriden_name) do ...
    end
  end
end
0 голосов
/ 12 января 2010

Вы можете попробовать, чтобы один из плагинов украшал атрибуты, а не переопределял их. Что-то вроде (я расширяю объект здесь, но вы можете расширить тот, кто в нем нуждается):

class Object
  def decorate!(attr)
    method = self.method(attr)
    define_method(attr) do |value|
      result = method.call(value)
      yield(result)
    end
  end
end

Так что с украшать! на месте вы можете попробовать это в act_as_textilized

def acts_as_textiled(*attributes)
.
  attributes.each do |attribute|
    self.decorate!(attribute) do |return_value_of_decorated_method|
    # decorate code here

Или что-то в этом роде. Не проверенный, вам, возможно, придется настроить, но я думаю, что основная идея есть.

...