178 votes

Comment découvrir les attributs d'un modèle dans Rails ?

Je trouve difficile de voir facilement quels attributs/propriétés existent sur toutes mes classes de modèle puisqu'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 l'un à l'autre en fonction des besoins du code que je suis en train d'écrire. Cela fonctionne mais c'est un peu lourd car je dois basculer entre la lecture du fichier schema pour récupérer les attributs, le fichier de classe du modèle pour vérifier les méthodes, et tout nouveau code que j'écris pour appeler les attributs et les méthodes.

Ma question est la suivante : comment découvrir les attributs d'un modèle lorsque vous analysez un code Rails pour la première fois ? Gardez-vous le fichier schema.rb ouvert en permanence, ou existe-t-il une meilleure méthode qui n'implique pas de passer constamment du fichier schema au fichier modèle ?

7 votes

Merci pour les réponses ci-dessous. Il semble qu'il n'y ait pas de bonne façon de déclarer les noms d'attributs dans le fichier source du modèle, mais plutôt de garder un terminal ouvert et de poke les objets pour connaître leurs propriétés.

322voto

penger Points 916

Pour les questions relatives aux schémas

Model.column_names         
Model.columns_hash         
Model.columns 

Par exemple, les variables/attributs dans un objet AR.

object.attribute_names                    
object.attribute_present?          
object.attributes

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

Model.instance_methods(false)

13 votes

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

2 votes

Dans ActiveRecord 5 (et probablement avant) vous pouvez appeler Model.attribute_names .

29voto

ez. Points 3836

Il existe un plugin pour rails appelé Annotate models, qui génère les attributs de votre modèle en haut 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 votes

Nouveau site pour ce que je suppose être le même plugin, github.com/ctran/annotate_models

20voto

Nick Points 168

Si vous n'êtes intéressé que par les propriétés et les types de données de la base de données, vous pouvez utiliser la fonction 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:create y 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

13voto

Haris Krajina Points 3051

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 une jolie empreinte pour vous décrire. ActiveRecord sans que vous ayez à subir des migrations ou à sauter que le développeur avant vous a eu la gentillesse de commenter dans les attributs.

0 votes

C'est parfait pour imprimer tous les attributs de toutes les instances d'un modèle particulier - merci !

8voto

mcandre Points 6965
some_instance.attributes

Fuente: blog

1 votes

Some_class.attributes.keys est un peu plus propre

0 votes

Je me demande si un IDE utilise cela pour l'autocomplétion ? Cela semble être une chose évidente à faire pour un modèle de rails. Je suis toujours déçu lorsque je commence à taper le nom d'un attribut et qu'il ne s'autocomplète pas.

2 votes

@frankodwyer - RubyMine le fait, mais je suis sûr qu'il doit y en avoir d'autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X