Erste Arten der Attribute in einem Objekt Active
-
25-09-2019 - |
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.
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}