142 votes

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

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

Par exemple:

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

et la table Number n'a qu'une colonne :one donc :two sera supprimé.

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

242voto

Andy Stewart Points 1641

Pour une classe

Utilisez Class.column_names.include? attr_nameattr_name est 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) or record.has_attribute?('attr_name') (Rails 3.2+) ou record.attributes.has_key? attr_name.

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

0 votes

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

31 votes

Dans Rails 3.2+, utilisez number.has_attribute? qui accepte un Symbole ou une Chaîne

1 votes

Je crois que si un objet délègue une méthode à un autre objet, cette méthode suggérera erronément que la colonne existe. Je vérifiais mes modèles pour ceux qui avaient un user, mais j'ai dû plutôt chercher user_id car certains modèles déléguaient l'utilisateur.

15voto

Nick Points 2909

Si vous avez besoin de vérifier également les alias, vous pouvez utiliser Number.method_defined? attr_name ou number.class.method_defined? attr_name.

J'ai dû le faire pour un objet Mongoid qui avait des champs aliés.

0 votes

J'ai trouvé que ModelName.attribute_method? :attr_name était ce qui fonctionnait dans mon cas

10voto

Alter Lagos Points 1527

Dans votre objet instance, vous pourriez également utiliser defined? instance.attribute ou instance.respond_to? :attribute.
Ce sont des solutions plus génériques pour vérifier un attribut de modèle ou une méthode quelconque également.

3 votes

Veuillez garder à l'esprit: instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true

5voto

askrynnikov Points 165

Si très simplifié

pour Model colonnes < attributs < méthodes

pour enregistrement colonnes = attributs < méthodes

Model.columns <> Model.record.columns/attributs

colonne

Vérification de l'existence d'une colonne pour un modèle Foo.column_names.include? 'nom_de_la_colonne'

La colonne existe-t-elle pour l'enregistrement ? foo.has_attribute?('nom_de_la_colonne')

attribut

Vérification de l'existence d'un attribut pour un modèle Foo.attribute_method?(:nom_de_l_attribut)

L'attribut existe-t-il pour l'enregistrement ? foo.has_attribute?(:nom_de_l_attribut)

méthode

Vérification de l'existence d'une méthode pour une classe Foo.method_defined?(:nom_de_la_methode)

La méthode existe-t-elle pour l'instance ? foo.respond_to?(:nom_de_la_methode)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X