Come scopri gli attributi del modello in Rails?


142

Sto trovando difficile vedere quali attributi / proprietà esistono su tutte le mie classi di modello poiché non sono esplicitamente definiti nei miei file di classe.

Per scoprire gli attributi del modello, tengo aperto il file schema.rb e lo sfoglio tra il codice che sto scrivendo e il necessario. Funziona ma è ingombrante perché devo passare dalla lettura del file dello schema per raccogliere gli attributi, al file della classe del modello per verificare i metodi e qualsiasi nuovo codice che sto scrivendo per chiamare attributi e metodi.

La mia domanda è: come scopri gli attributi del modello quando analizzi una base di codice Rails per la prima volta? Tieni il file schema.rb sempre aperto o esiste un modo migliore che non comporta il salto continuo tra il file schema e il file modello?


7
Grazie per le risposte di seguito. Sembra che non ci sia un buon modo per dichiarare i nomi degli attributi nel file sorgente del modello, ma piuttosto tenere un terminale aperto e colpire gli oggetti per scoprire le loro proprietà.
— gbc,

Risposte:


276

Per cose relative allo schema

Model.column_names         
Model.columns_hash         
Model.columns 

Ad esempio variabili / attributi in un oggetto AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Ad esempio metodi senza eredità da superclasse

Model.instance_methods(false)

10
Per ottenere anche le associazioni puoi fare: Model.reflect_on_all_associations.map (&: nome)
— vasilakisfil,

1
In ActiveRecord 5 (e probabilmente in precedenza) puoi chiamare Model.attribute_names.
— aceofbassgreg,


15

Se sei solo interessato alle proprietà e ai tipi di dati dal database, puoi usare 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)"

In alternativa, dopo aver eseguito rake db:createe rake db:migrateper l'ambiente di sviluppo, il file db/schema.rbconterrà l'origine autorevole per la struttura del database:

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

Per descrivere il modello utilizzo il seguente frammento

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

Ancora una volta questo è se stai cercando una stampa carina per descriverti ActiveRecordsenza passare attraverso le migrazioni o saltare lo sviluppatore prima che tu fossi abbastanza gentile da commentare gli attributi.


Questo è perfetto per stampare tutti gli attributi di tutte le istanze per un modello particolare - grazie!
— ConorB,

4
some_instance.attributes

Fonte: blog


some_class.attributes.keys è un po 'più pulito
— klochner il

ti chiedi se qualche IDE lo utilizza per il completamento automatico? Sembra una cosa ovvia da fare per un modello di binari. Sono sempre deluso quando inizio a digitare un nome di attributo e non si completa automaticamente.
— frankodwyer,

2
@frankodwyer - RubyMine lo fa, anche se sono sicuro che ce ne devono essere altri.
— Matt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.