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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top