2010-11-10 7 views
9

¿Cuál es la mejor manera de obtener el tipo de atributo en Active Record (incluso antes de que se haya asignado el atributo)? Por ejemplo (esto no funciona, solo el objetivo):Ruby on Rails Active Record Attribute 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 

¡Gracias!

Respuesta

13

Incluso sin tener una instancia del modelo, puede usar Model.columns_hash que es un hash de las columnas del modelo codificado en el nombre del atributo, p.

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

actualización

Como Kevin ha comentado el propio, si tiene una instancia de modelo (por ejemplo @user) entonces el método column_for_attribute se puede utilizar, por ejemplo,

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

Desde el Rails API docs se puede ver que esto es sólo un envoltorio que llama columns_hash de la clase de la instancia:

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

Gracias Mike! Esto conduce a ser: '@ user.column_for_attribute (: name) .type'. ¡Exactamente lo que necesitaba! –

+0

Sí, si tiene una instancia de su modelo, 'columns_for_attribute' es incluso mejor. He actualizado la respuesta para mencionar eso. – mikej

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

¿Alguna palabra para acompañar el código? –