Comment découvrez-vous les attributs de modèle dans Rails?

142

Je trouve difficile de voir facilement quels attributs / propriétés existent sur toutes mes classes de modèle car ils ne sont pas explicitement définis dans mes fichiers de classe.

Pour découvrir les attributs du modèle, je garde le fichier schema.rb ouvert et je passe de celui-ci au code que j'écris au besoin. Cela fonctionne mais est maladroit car je dois basculer entre la lecture du fichier de schéma pour récupérer les attributs, le fichier de classe de modèle pour vérifier les méthodes et tout nouveau code que j'écris pour appeler des attributs et des méthodes.

Ma question est la suivante: comment découvrez-vous les attributs d'un 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 existe-t-il un meilleur moyen qui n'implique pas de sauter constamment entre le fichier de schéma et le fichier de modèle?

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

Réponses:

276

Pour les éléments liés au schéma

Model.column_names         
Model.columns_hash         
Model.columns 

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

object.attribute_names                    
object.attribute_present?          
object.attributes

Par exemple les méthodes sans héritage de la super classe

Model.instance_methods(false)
penger
la source
10
Pour obtenir les associations aussi, vous pouvez faire: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
Dans ActiveRecord 5 (et probablement plus tôt), vous pouvez appeler Model.attribute_names.
aceofbassgreg
27

Il existe un plugin de rails appelé Annoter les modèles, qui générera vos attributs de modèle en haut de vos fichiers de modèle, voici le lien:

https://github.com/ctran/annotate_models

pour garder l'annotation synchronisée, vous pouvez écrire une tâche pour régénérer les modèles d'annotation après chaque déploiement.

ez.
la source
3
Nouveau site pour ce que je suppose est le même plugin, github.com/ctran/annotate_models
James McMahon
15

Si vous êtes uniquement 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)"

Alternativement, après avoir exécuté rake db:createet rake db:migratepour votre environnement de développement, le fichier db/schema.rbcontiendra la source faisant autorité pour votre structure de 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
pseudo
la source
10

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

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

Encore une fois, c'est si vous cherchez un joli papier pour vous décrire ActiveRecordsans que vous ayez besoin de migrer ou de sauter ce développeur avant que vous n'ayez été assez gentil pour commenter les attributs.

Haris Krajina
la source
C'est parfait pour imprimer tous les attributs de toutes les instances pour un modèle particulier - merci!
ConorB
4
some_instance.attributes

Source: blog

mcandre
la source
some_class.attributes.keys est un peu plus propre
klochner
me demande si des IDE l'utilisent pour l'auto-complétion? Cela semble être une chose évidente à faire pour un modèle de rails. Je suis toujours déçu lorsque je commence à taper un nom d'attribut et qu'il ne se termine pas automatiquement.
frankodwyer
2
@frankodwyer - RubyMine le fait, même si je suis sûr qu'il doit y en avoir d'autres.
Matt