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