2009-11-10 12 views
92

Ho un metodo che deve scorrere un hash e controllare se ciascuna chiave esiste in una tabella di modelli, altrimenti cancellerà la chiave/valore.Come verificare se un modello ha una determinata colonna/attributo?

ad esempio

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

e la tabella numero ha solo: una colonna in modo da: due saranno eliminati.

Come si verifica se un modello ha o meno un attributo?

risposta

159

Per una classe

Usa Class.column_names.include? attr_name dove attr_name è il nome della stringa del attributo.

In questo caso: Number.column_names.include? 'one'

Per un'istanza

Uso record.has_attribute?(:attr_name) o record.has_attribute?('attr_name') (rotaie 3.2 +) o record.attributes.has_key? attr_name.

In questo caso: number.has_attribute?(:one) o number.has_attribute?('one') o number.attributes.has_key? 'one'

+0

Per i punti bonus usare 'Hash # select':' number_hash.select {| chiave, valore | Number.column_names.include? chiave} ' – hgmnz

+27

In Rails 3.2+, usare' number.has_attribute? 'che accetta un simbolo o una stringa –

+0

Credo che se un oggetto delega un metodo a un altro oggetto, questo metodo suggerirà erroneamente che la colonna esista. Stavo controllando i miei modelli per quelli che avevano un 'utente', ma dovevo invece cercare' user_id' dato che alcuni modelli hanno delegato l'utente. – MattyB

9

Se è necessario verificare la presenza di alias pure, è possibile utilizzare Number.method_defined? attr_name o number.class.method_defined? attr_name.

Ho dovuto eseguire questa operazione per un oggetto Mongoide con campi con alias.

+1

'ModelName.method_defined? : attr_name' ha funzionato bene! –

7

Nell'oggetto di istanza, è possibile utilizzare anche defined? instance.attribute o instance.respond_to? :attribute.
Queste sono soluzioni più generiche per verificare anche un attributo di modello o qualsiasi metodo.

+3

Si prega di tenere presente: 'instance.respond_to? (: Attribute) == false; instance.attribute; instance.respond_to? (: attribute) == true' – kbrock

Problemi correlati