2010-11-10 2 views
9

Quel est le meilleur moyen d'obtenir le type d'un attribut dans l'enregistrement actif (avant même que l'attribut ait été attribué)? Par exemple (cela ne fonctionne pas, juste le but):Ruby on Rails Attribut d'enregistrement actif 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 

Merci!

Répondre

13

Même sans avoir une instance du modèle, vous pouvez utiliser Model.columns_hash qui est un hachage des colonnes sur le modèle saisi sur le nom d'attribut, par ex.

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

Mise à jour

Comme Kevin lui-même a commenté, si vous avez une instance de modèle (par exemple @user), puis la méthode column_for_attribute peut être utilisé par exemple

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

De l'Rails API docs vous pouvez voir c'est juste un wrapper qui appelle columns_hash sur la classe de l'instance:

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

Merci Mike! Cela conduit à: '@ user.column_for_attribute (: name) .type'. Exactement ce dont j'avais besoin! –

+0

Oui, si vous avez une instance de votre modèle alors 'columns_for_attribute' est encore meilleur. J'ai mis à jour la réponse pour le mentionner. – mikej

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

Des mots pour accompagner le code? –