alias_attribute y la creación y el método con el nombre de atributo de origen, plantea un bucle
-
05-10-2019 - |
Pregunta
Im tratando de crear dinámicamente una cadena método en un solo atributo en mi modelo. Por ahora tengo esta función:
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
por lo que reciben una cadena con el nombre del atributo, un alias para ' _without_filter ' (alias_method o alias_method_chain falla aquí, porque la tampoco atributo allí cuando se crea la clase), y se crea un nuevo método con el nombre del atributo, donde puedo filtrar su contenido.
Pero de alguna manera, cuando llamo "# {nombre_atributo} _without_filter" que llama mi nuevo método (creo que debido a que el alias_attribute de alguna forma), y el programa entra en un bucle pila.
Estoy tratando de cambiar el nombre de ese atributo, para que pueda utilizar su nombre para un método ...
Puede alguien por favor me ilumine en esto.
Solución
Hay una diferencia entre alias_method
y alias_attribute
. alias_method que realmente hace un copiar del método de edad, mientras que alias_attribute simplemente define nuevos métodos, que Llamada de los viejos .
Tenga en cuenta, que los métodos model.attribute
y model.attribute=
en ActiveRecord simplemente llaman read_attribute y write_attribute , por lo que siempre puede acceder a su atributo, incluso si que lo sustituya de getter o setter:
define_method "#{attribute_name}" do
filter_words(self.read_attribute(attribute_name))
end