Question

Je voudrais savoir s'il est possible d'obtenir les types (comme cela est connu par AR - par exemple dans le script de migration et base de données) programme (je sais que les données existent là-dedans quelque part).

Par exemple, je peux faire face à tous les noms d'attributs:

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

.attributes retourne juste un mappage des noms à leurs valeurs actuelles (par exemple, pas d'info type si le champ est pas défini).

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

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

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

Il est donc clair qu'il connaît les types. En outre, il y a .column_for_attribute, qui prend le nom d'attr et retourne un objet de colonne - qui a le type enterré dans l'objet de la colonne de base de données sous-jacente, mais il ne semble pas être un moyen propre pour l'obtenir.

Je serais également intéressé s'il y a une manière amicale pour le nouveau « ActiveModel » qui vient (rails3) et est découplée de détails de base de données (mais tapez peut-être d'info ne sera pas une partie de celui-ci, je peux » t semblent savoir si elle est).

Merci.

Était-ce utile?

La solution

Dans Rails 3, pour votre modèle "Driver", vous voulez Driver.columns_hash.

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

Si vous voulez itérer à travers eux, vous feriez quelque chose comme ceci:

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

qui affichera les éléments suivants:

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

Autres conseils

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

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

Si vous voulez obtenir une liste de tous les types de colonnes dans un modèle particulier, vous pouvez faire:

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

Dans Rails 5, vous pouvez le faire indépendamment de la base de données. C'est important si vous utilisez la nouvelle API Attributs pour définir (supplémentaires) attributs.

Obtenir tous les attributs d'une classe de modèle:

pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

Obtenir le type:

pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

C'est parfois plus d'informations que nécessaire. Il y a une fonction pratique qui associe tous ces types à un ensemble de base (: entier,:. Chaîne, etc.)

> User.type_for_attribute('email').type
=> :string 

Vous pouvez également obtenir toutes ces données dans un appel avec attribute_types qui retourne un hachage 'name': type.

Dans les rails 5 cela vous donnera une liste de tous les noms de champs ainsi que leur type de données:

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end

Cet extrait vous donnera tous les attributs d'un modèle avec les types de données de base de données associées à un hachage. Il suffit de remplacer votre modèle post avec Active Record.

Post.attribute_names.map {|n| [n.to_sym,Post.type_for_attribute(n).type]}.to_h

renvoie un hachage comme celui-ci.

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top