2010-11-10 13 views
9

Jaki jest najlepszy sposób uzyskania typu atrybutu w rekordzie aktywnym (nawet przed przypisaniem atrybutu)? Na przykład (to nie działa, tylko cel):Introspekcja wartości atrybutu Ruby on Rails

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

Dzięki!

Odpowiedz

13

Nawet bez instancji modelu można użyć wartości mieszania kolumn w modelu z wpisaną nazwą atrybutu, np.

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

Aktualizacja

Jak Kevin skomentował się, jeśli masz wystąpienie modelu (np @user) to metoda column_for_attribute może być używany na przykład

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

Od Rails API docs widać to tylko wrapper, który wywołuje columns_hash od klasy instancji:

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

Dzięki Mike! Doprowadziło to do: '@ user.column_for_attribute (: name) .type'. Dokładnie to, czego potrzebowałem! –

+0

Tak, jeśli masz instancję swojego modelu, to 'column_for_attribute' jest jeszcze lepsze. Zaktualizowałem odpowiedź, aby o tym wspomnieć. – mikej

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

Jakieś słowa, które pasują do kodu? –