2009-08-17 3 views
107

J'ai commencé ma première application Rails l'automne dernier et j'ai dû la mettre sur l'étagère pendant quelques mois en payant le travail absorbé tout le temps. Je suis maintenant intéressé à revenir au projet et à lire le code pour savoir où je me suis arrêté. Le fait que Rails crée dynamiquement des attributs de modèle à l'exécution économise beaucoup de typage répétitif, mais je trouve difficile de découvrir facilement quels attributs/propriétés existent sur toutes mes classes de modèles puisqu'elles ne sont pas explicitement définies dans ma classe des dossiers. Pour découvrir les attributs du modèle, je garde le fichier schema.rb ouvert et je le retourne et quel que soit le code que j'écris qui utilise les propriétés d'un modèle. Cela fonctionne mais est maladroit parce que je dois lire le fichier de schéma pour ramasser des attributs, le fichier de classe de modèle pour prendre des méthodes, et tout nouveau code que j'écris pour appeler les attributs & méthodes. Donc, ma question est, comment pouvez-vous découvrir les propriétés du modèle lorsque vous analysez une base de code Rails pour la première fois? Gardez-vous le fichier schema.rb ouvert tout le temps, ou y a-t-il un meilleur moyen qui ne consiste pas à sauter entre le fichier de schéma & fichier de modèle en permanence?Comment découvrir les attributs du modèle dans Rails

+6

Merci pour les réponses ci-dessous. Il semble qu'il n'y ait pas de bon moyen de déclarer les noms d'attribut dans le fichier source du modèle, mais plutôt de garder un terminal ouvert et de rechercher les propriétés dans les objets. – gbc

Répondre

219

pour le schéma des choses liées

Model.column_names   
Model.columns_hash   
Model.columns 

Pour les variables d'instance/attributs dans un objet AR

object.attribute_names      
object.attribute_present?   
object.attributes 

Pour les méthodes d'instance sans héritage de classe super

Model.instance_methods(false) 
+9

Pour obtenir les associations aussi, vous pouvez faire: Model.reflect_on_all_associations.map (&: name) – Filippos

+1

Dans ActiveRecord 5 (et probablement plus tôt), vous pouvez appeler 'Model.attribute_names' – aceofbassgreg

4
some_instance.attributes 

Source: blog

+0

some_class.attributes.clés est un peu plus propre – klochner

+0

se demander si tous les IDE utilisent cela pour l'auto-complétion? On dirait une chose évidente à faire pour un modèle de rails. Je suis toujours déçu quand je commence à taper un nom d'attribut et qu'il ne se termine pas automatiquement. – frankodwyer

+7

Puisque 'attributes' est une méthode d'instance, l'exemple de code correct indiquerait' some_instance.attributes'. – RocketR

24

Il y a un rails plugin appelé modèles annoter, qui va générer votre modèle attribue au-dessus de vos fichiers de modèle voici le lien:

https://github.com/ctran/annotate_models

pour que l'annotation reste synchronisée, vous pouvez écrire une tâche pour générer à nouveau des modèles d'annotation après chaque déploiement.

+3

Nouveau site pour ce que je suppose est le même plugin, https://github.com/ctran/annotate_models –

9

Si vous êtes juste intéressé par les propriétés et les types de données de la base de données, vous pouvez utiliser Model.inspect.

irb(main):001:0> User.inspect 
=> "User(id: integer, email: string, encrypted_password: string, 
reset_password_token: string, reset_password_sent_at: datetime, 
remember_created_at: datetime, sign_in_count: integer, 
current_sign_in_at: datetime, last_sign_in_at: datetime, 
current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, 
updated_at: datetime)" 

Vous pouvez également avoir couru rake db:create et rake db:migrate pour votre environnement de développement, le fichier db/schema.rb contiendra la source faisant autorité pour la structure de votre base de données:

ActiveRecord::Schema.define(version: 20130712162401) do 
    create_table "users", force: true do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 
end 
8

Pour décrire le modèle que j'utilise suivant extrait

Model.columns.collect { |c| "#{c.name} (#{c.type})" } 

Encore une fois c'est si vous cherchez joli imprimé pour vous décrire ActiveRecord sans que vous n'effectuiez des migrations ou des sauts de ce développeur avant que vous ne soyez assez gentil pour commenter les attributs.

+0

Ceci est parfait pour imprimer tous les attributs de toutes les instances pour un modèle particulier - merci! – ConorB

Questions connexes