Frage

Ich würde gerne wissen, ob es möglich ist, die Arten zu erhalten (wie durch AR bekannt - zum Beispiel in dem Migrationsscript und Datenbank) programmatisch (Ich weiß, dass die Daten dort irgendwo vorhanden ist).

Zum Beispiel kann ich mit allen Attributnamen umgehen:

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

.attributes gibt nur eine Zuordnung der Namen auf ihre aktuellen Werte (zB keine Typinformationen, wenn das Feld nicht gesetzt ist).

Einige Orte, die ich mit der Typinformation gesehen haben:

in Skript / Konsole, geben Sie den Namen einer AR-Instanz:

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

So klar weiß es die Typen. Außerdem gibt es .column_for_attribute, die einen attr Namen gab und gibt eine Spaltenobjekt - die den Typ in der zugrunde liegenden Datenbankspalte Objekt begraben hat, aber es scheint nicht eine saubere Art und Weise zu sein, um es zu bekommen.

ich würde auch interessieren, ob es einen Weg gibt, die für die neue „ActiveModel“ freundlich ist, die (rails3) kommt, und wird von der Datenbank Spezifika entkoppelt (aber vielleicht Informationen geben nicht ein Teil davon sein, ich kann‘ t scheinen, um herauszufinden, ob es ist).

Danke.

War es hilfreich?

Lösung

In Rails 3, für das Modell "Driver", mögen Sie Driver.columns_hash.

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

Wenn Sie durch sie zu wiederholen möchten, können Sie so etwas tun würde:

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

denen Ausgang der folgende:

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

Andere Tipps

Sie können die Typen der Spalten zugreifen, indem dies zu tun:

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

Wenn Sie eine Liste aller Spaltentypen in einem bestimmten Modell bekommen möchten, können Sie tun:

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

In Rails 5 können Sie diese unabhängig von der Datenbank tun. Das ist wichtig, wenn Sie die neuen Attribute API verwenden, um zu definieren (zusätzliche) zuschreibt.

Getting alle Attribute aus einer Modellklasse:

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

Ankommen vom Typ:

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

Das ist manchmal mehr Informationen als nötig. Es gibt eine Komfortfunktion, die diese Typen alle Karten bis auf einen Kernsatz (: integer,: string. Etc)

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

Sie können auch alle, dass Daten in einem Aufruf mit attribute_types erhalten, die einem 'name': type Hash zurück.

In Schienen 5 dies werden Sie eine Liste aller Feldnamen zusammen mit ihrem Datentyp:

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

Dieser Code-Schnipsel gibt Ihnen alle Attribute ein Modell mit den dazugehörigen Datenbankdatentypen in einem Hash. Ersetzen Sie einfach erstellen Sie Ihre Active Record Modell.

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

Wird eine Hash wie folgt zurück.

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top