2009-11-10 20 views
92

Tengo un método que necesita recorrer un hash y verificar si cada clave existe en una tabla de modelos, de lo contrario eliminará la clave/valor.¿Cómo verificar si un modelo tiene una determinada columna/atributo?

por ejemplo

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

y la tabla de números sólo tiene una: una columna de modo: dos se eliminarán.

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

Respuesta

159

Para una clase

Uso Class.column_names.include? attr_name donde attr_name es el nombre de la cadena del atributo.

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

Para un ejemplo

Uso record.has_attribute?(:attr_name) o record.has_attribute?('attr_name') (Rails 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'

+0

Para puntos de bonificación, use 'Hash # select':' number_hash.select {| key, value | Number.column_names.include? key} ' – hgmnz

+27

En Rails 3.2+, use' number.has_attribute? 'que acepte un Símbolo o una Cadena –

+0

Creo que si un objeto delega un método a otro objeto, este método erróneamente sugerirá que la columna existe. Estaba revisando mis modelos por los que tenían un 'usuario', pero en su lugar tuve que buscar' user_id' ya que algunos modelos delegaron al usuario. – MattyB

9

Si es necesario comprobar para los alias, así, puede utilizar Number.method_defined? attr_name o number.class.method_defined? attr_name.

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

+1

'ModelName.method_defined? : attr_name' funcionó bien! –

7

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

+3

Tenga en cuenta: 'instance.respond_to? (: Attribute) == false; instancia.atributo; instance.respond_to? (: attribute) == true' – kbrock

Cuestiones relacionadas