alias_attribute и создание и метод с исходным именем атрибута вызывает цикл
-
05-10-2019 - |
Вопрос
Я пытаюсь динамически создавать цепочку метода в одном атрибуте в моей модели. К настоящему времени у меня есть эта функция:
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 некоторые как), и программа переходит в цикл стека.
Я пытаюсь переименовать этот атрибут, поэтому я могу использовать его имя для метода ...
Может кто-нибудь, пожалуйста, просветите меня на этом.
Решение
Существует разница между 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