Come verificare se un modello ha una determinata colonna / attributo?


123

Ho un metodo che deve eseguire un ciclo attraverso un hash e controllare se ogni chiave esiste in una tabella dei modelli, altrimenti eliminerà la chiave / valore.

per esempio

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

e la tabella dei numeri ha solo una: una colonna quindi: due verranno cancellate.

Come posso verificare se un modello ha o meno un attributo?

Risposte:


205

Per una lezione

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

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

Per esempio

Utilizzare record.has_attribute?(:attr_name)o record.has_attribute?('attr_name')(Rails 3.2+) o record.attributes.has_key? attr_name.

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


Per i punti bonus utilizzare Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz

28
In Rails 3.2+, usa number.has_attribute?che accetta un simbolo o una stringa
Marc-André Lafortune

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 user, ma ho dovuto invece cercare user_idpoiché alcuni modelli delegavano l'utente.
MattyB

Hash#has_key?è deprecato a favore diHash#key?
Charles Hamel

Che ne dici di usare attribute_method? per una lezione:Number.attribute_method? 'one'
ouranos

13

Se hai bisogno di controllare anche gli alias, puoi usare Number.method_defined? attr_nameo number.class.method_defined? attr_name.

Ho dovuto farlo per un oggetto Mongoid che aveva campi con alias.


Ho scoperto che ModelName.attribute_method? :attr_nameera ciò che ha funzionato nel mio caso
direzione

10

Nel tuo oggetto istanza, potresti usare anche defined? instance.attributeo instance.respond_to? :attribute.
Queste sono soluzioni più generiche per controllare un attributo del modello o anche qualsiasi metodo.


3
Tieni presente che:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.