2010-11-10 6 views
9

Was ist der beste Weg, um den Typ eines Attributs in Active Record (noch bevor das Attribut zugewiesen wurde) zu bekommen? Zum Beispiel (das funktioniert nicht, nur das Ziel):Ruby on Rails Active Record-Attribut Introspection

User.new 
User.inspect(:id)   # :integer 
User.inspect(:name)  # :string 
User.inspect(:password) # :string 
User.inspect(:updated_at) # :datetime 
User.inspect(:created_at) # :datetime 

Vielen Dank!

Antwort

13

Auch ohne eine Instanz des Modells können Sie Model.columns_hash verwenden, die ein Hash der Spalten auf dem Modell ist, die auf den Attributnamen z.

User.columns_hash['name'].type # => :string 
User.columns_hash['id'].type # => :integer 
User.columns_hash['created_at'].type # => :datetime 

aktualisieren

Wie Kevin hat sich kommentiert, wenn Sie eine Modellinstanz (z.B. @user), dann die column_for_attribute Verfahren zum Beispiel verwendet werden kann,

@user.column_for_attribute(:name) # => :string 

Von der Rails API docs Sie können sehen, das ist nur ein Wrapper ist die columns_hash auf der Instanz der Klasse aufruft:

def column_for_attribute(name) 
    self.class.columns_hash[name.to_s] 
end 
+1

Danke Mike! Dies führt zu: "@ user.column_for_attribute (: name) .type". Genau das, was ich brauchte! –

+0

Ja, wenn Sie eine Instanz Ihres Modells haben, ist 'columns_for_attribute' noch besser. Ich habe die Antwort aktualisiert, um das zu erwähnen. – mikej

0
Model.type_for_attribute('attr_name') # ActiveModel::Type::Value 
Model.attribute_types 
+0

Irgendwelche Wörter, um mit dem Code zu gehen? –