75 votes

Obtenir les types des attributs à un objet ActiveRecord

Je voudrais savoir si il est possible d'obtenir les types (comme on le sait par l'AR - par exemple dans le script de migration et de base de données) par programmation (je sais que les données existent, quelque part).

Par exemple, je peux traiter de tous les noms d'attribut:

ar.attribute_names.each { |name| puts name }

.attributs retourne juste une cartographie des noms à leurs valeurs actuelles (par exemple, aucun type d'info si le champ n'est pas défini).

Certains des endroits que je l'ai vu avec les informations de type:

dans le script/console, tapez le nom d'un AR entité:

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

Donc clairement, il sait les types. Aussi, il est .column_for_attribute, qui prend un attr nom et renvoie un objet de colonne dont le type enterré dans la base de données de la colonne de l'objet, mais il ne semble pas être un moyen propre à obtenir.

Je serais également intéressé si il y a un moyen qui est sympathique pour le nouveau "ActiveModel" qui est à venir (rails3) et est découplé de la base de données spécifiques (mais peut-être le type d'info ne va pas être de la partie, je n'arrive pas à savoir si c'est elle).

Merci.

115voto

Grant Birchmeier Points 4023

Dans Rails 3, pour le modèle "Pilote", vous souhaitez Driver.columns_hash.

Driver.columns_hash["name"].type  #returns :string

Si vous souhaitez effectuer une itération à travers eux, vous feriez quelque chose comme ceci:

Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}

qui sera de sortie suivants:

id => integer
name => string
created_at => datetime
updated_at => datetime

23voto

Mike Trpcic Points 12741

Vous pouvez accéder aux types des colonnes en faisant ceci:

#script/console
Driver.columns.each {|c| puts c.type}

Si vous souhaitez obtenir une liste de tous les types de colonne dans un Modèle particulier, vous pouvez faire:

Driver.columns.map(&:type) #get's them all
Driver.columns.map(&:type).uniq #get's the unique ones

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