¿Cómo comprobar si un modelo tiene una determinada columna / atributo?


Tengo un método que necesita hacer un bucle a través de un hash y verificar si cada clave existe en una tabla de modelos, de lo contrario eliminará la clave/valor.

Por ejemplo

number_hash = { :one => "one", :two => "two" }

Y la tabla de números solo tiene una columna :one, por lo que se eliminarán dos.

¿Cómo puedo comprobar si un modelo tiene un atributo o no?

Author: dMix, 2009-11-10

3 answers

Para una clase

Use Class.column_names.include? attr_name donde attr_name es el nombre de cadena de su atributo.

En este caso: Number.column_names.include? 'one'

Por ejemplo

Use record.has_attribute?(:attr_name) o record.has_attribute?('attr_name') (Carriles 3.2+) o record.attributes.has_key? attr_name.

En este caso: number.has_attribute?(:one) o number.has_attribute?('one') o number.attributes.has_key? 'one'

 175
Author: Andy Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-25 04:34:51

Si también necesita buscar alias, puede usar Number.method_defined? attr_name o number.class.method_defined? attr_name.

Tuve que hacer esto para un objeto Mongoid que tenía campos aliased.

 9
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 19:24:48

En su objeto de instancia, puede usar también defined? instance.attribute o instance.respond_to? :attribute.
Estas son soluciones más genéricas para verificar un atributo de modelo o cualquier método también.

 7
Author: Alter Lagos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-18 21:20:42