Comment vérifier si un modèle a une certaine colonne / attribut?


123

J'ai une méthode qui doit parcourir un hachage et vérifier si chaque clé existe dans une table de modèles, sinon elle supprimera la clé / valeur.

par exemple

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

et la table des nombres n'a qu'une colonne: un donc: deux seront supprimés.

Comment vérifier si un modèle a un attribut ou non?

Réponses:


205

Pour un cours

Utilisez Class.column_names.include? attr_nameattr_nameest le nom de chaîne de votre attribut.

Dans ce cas: Number.column_names.include? 'one'

Pour une instance

Utilisez record.has_attribute?(:attr_name)ou record.has_attribute?('attr_name')(Rails 3.2+) ou record.attributes.has_key? attr_name.

Dans ce cas: number.has_attribute?(:one)ou number.has_attribute?('one')ounumber.attributes.has_key? 'one'


Pour les points bonus, utilisez Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz

28
Dans Rails 3.2+, utiliser number.has_attribute?qui accepte un symbole ou une chaîne
Marc-André Lafortune

Je crois que si un objet délègue une méthode à un autre objet, cette méthode suggérera à tort que la colonne existe. Je vérifiais mes modèles pour ceux qui avaient un user, mais je devais plutôt chercher user_iddepuis que certains modèles ont délégué l'utilisateur.
MattyB

Hash#has_key?est déconseillé au profit deHash#key?
Charles Hamel

Que diriez-vous d'utiliser attribute_method? pour un cours:Number.attribute_method? 'one'
ouranos

13

Si vous devez également rechercher des alias, vous pouvez utiliser Number.method_defined? attr_nameou number.class.method_defined? attr_name.

J'ai dû faire cela pour un objet mongoïde qui avait des champs aliasés.


J'ai trouvé ModelName.attribute_method? :attr_namece qui a fonctionné dans mon cas
direction du

10

Dans votre objet d'instance, vous pouvez également utiliser defined? instance.attributeou instance.respond_to? :attribute.
Il s'agit d'une solution plus générique pour vérifier un attribut de modèle ou toute méthode.


3
Veuillez garder à l'esprit:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.