2009-08-17 12 views
107

Ho iniziato la mia prima applicazione Rails lo scorso autunno e ho dovuto metterlo sullo scaffale per alcuni mesi, quando il pagamento del lavoro ha risucchiato tutto il mio tempo. Ora sono interessato a tornare al progetto e leggere il codice per capire da dove ho lasciato.Come si scoprono gli attributi del modello in Rails

Il fatto che Rails crea dinamicamente gli attributi del modello in fase di runtime consente di risparmiare un sacco di digitazioni ripetitive, ma trovo difficile scoprire facilmente quali attributi/proprietà esistono su tutte le mie classi del modello poiché non sono definite esplicitamente nella mia classe File. Per scoprire gli attributi del modello, tengo il file schema.rb aperto e capovolgo tra esso e il codice che sto scrivendo che utilizza le proprietà di un modello. Funziona ma è goffo perché devo leggere il file dello schema per raccogliere gli attributi, il file della classe del modello per raccogliere i metodi e qualsiasi nuovo codice che sto scrivendo per chiamare gli attributi & metodi.

Quindi la mia domanda è: come si scoprono le proprietà del modello quando si analizza una base di codici Rails per la prima volta? Mantenete il file schema.rb sempre aperto oppure esiste un modo migliore che non implichi un salto costante tra file di modello del file dello schema &?

+6

Grazie per le risposte qui sotto. 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

risposta

219

per lo schema cose relative

Model.column_names   
Model.columns_hash   
Model.columns 

Per le variabili di istanza/attributi in un oggetto AR

object.attribute_names      
object.attribute_present?   
object.attributes 

Per metodi di istanza senza eredità da super classe

Model.instance_methods(false) 
+9

Per ottenere anche le associazioni puoi fare: Model.reflect_on_all_associations.map (&: name) – Filippos

+1

In ActiveRecord 5 (e probabilmente anche prima) puoi chiamare 'Model.attribute_names'. – aceofbassgreg

4
some_instance.attributes 

Fonte: blog

+0

some_class.attributes.le chiavi sono un po 'più pulite – klochner

+0

chiedo se qualche IDE lo usa per il completamento automatico? Sembra una cosa ovvia da fare per un modello di rotaie. Sono sempre deluso quando inizio a digitare un nome di attributo e non si completa automaticamente. – frankodwyer

+7

Poiché 'attributes' è un metodo di istanza, l'esempio di codice corretto direbbe some_instance.attributes'. – RocketR

24

C'è un rotaie plugin chiamato modelli Annotazione, che genererà il vostro modello di attributi sulla parte superiore dei file modello ecco il link:

https://github.com/ctran/annotate_models

per mantenere sincronizzata l'annotazione, è possibile scrivere un'attività per rigenerare i modelli di annotazione dopo ogni distribuzione.

+3

Nuovo sito per quello che presumo sia lo stesso plug-in, https://github.com/ctran/annotate_models –

9

Se sei interessato solo alle proprietà e ai tipi di dati dal database, è possibile utilizzare 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:create e rake db:migrate per l'ambiente di sviluppo, il file db/schema.rb conterrà la fonte 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 
8

Per descrivere il modello che uso seguente frammento

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

Anche in questo caso se stai cercando una bella stampa per descriverti ActiveRecord senza che tu stia procedendo alle migrazioni o saltando lo sviluppatore prima di essere abbastanza gentile da commentare gli attributi.

+0

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

Problemi correlati