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?

dMix
la source

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'

Andy Stewart
la source
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.

pseudo
la source
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.

Alter Lagos
la source
3
Veuillez garder à l'esprit:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock