alias_attribute и создание и метод с исходным именем атрибута вызывает цикл

Я пытаюсь динамически создать цепочку методов в одном атрибуте в моей модели. К настоящему времени у меня есть эта функция:

def create_filtered_attribute(attribute_name)
          alias_attribute "#{attribute_name}_without_filter", attribute_name

          define_method "#{attribute_name}" do
            filter_words(self.send("#{attribute_name}_without_filter"))
          end
end

поэтому я получаю строку с именем атрибута, псевдоним ее для "_without_filter" (alias_method или alias_method_chain здесь терпит неудачу, потому что атрибут не существует при создании класса), и я создаю новый метод с именем атрибута, где я фильтрую его содержание.

Но почему-то, когда я вызываю "#{attribute_name}_without_filter", он вызывает мой новый метод (я думаю, потому что alias_attribute кое-как), и программа переходит в цикл стека.

Я пытаюсь переименовать этот атрибут, чтобы я мог использовать его имя для метода...

Может кто-нибудь, пожалуйста, просветите меня об этом.

1 ответ

Решение

Есть разница между alias_method а также alias_attribute, alias_method фактически делает копию старого метода, тогда как alias_attribute просто определяет новые методы, которые вызывают старые.

Обратите внимание, что model.attribute а также model.attribute= Методы в ActiveRecord просто вызывают read_attribute и write_attribute, так что вы всегда можете получить доступ к своему атрибуту, даже если вы переопределите его getter или setter:

  define_method "#{attribute_name}" do
    filter_words(self.read_attribute(attribute_name))
  end
Другие вопросы по тегам