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?


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)

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


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

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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.