2009-08-17 6 views
107

Ich begann meine erste Rails-Anwendung im letzten Herbst und musste für ein paar Monate in das Regal legen, wenn bezahlte Arbeit die ganze Zeit absaugte. Ich bin jetzt daran interessiert, zurück zum Projekt zu gehen und den Code durchzulesen, um herauszufinden, wo ich aufgehört habe.Wie erkennen Sie Modellattribute in Rails

Die Tatsache, dass Rails dynamisch Modellattribute zur Laufzeit erstellt, spart eine Menge repetitiver Typisierung, aber es fällt mir schwer zu erkennen, welche Attribute/Eigenschaften in allen meinen Modellklassen existieren, da sie nicht explizit in meiner Klasse definiert sind Dateien. Um Modellattribute zu erkennen, lasse ich die Datei schema.rb geöffnet und blättere zwischen ihr und dem Code, den ich schreibe, der die Eigenschaften eines Modells verwendet. Das funktioniert, ist aber klobig, weil ich die Schemadatei lesen muss, um Attribute aufzunehmen, die Modellklassendatei, um Methoden aufzunehmen, und welchen neuen Code ich schreibe, um Attribute & Methoden aufzurufen.

Also meine Frage ist, wie entdecken Sie Modelleigenschaften, wenn Sie eine Rails Codebasis zum ersten Mal analysieren? Halten Sie die Datei schema.rb die ganze Zeit offen, oder gibt es einen besseren Weg, der nicht ständig zwischen der Modelldatei der Schemadatei & springt?

+6

Danke für die Antworten unten. Es klingt, als ob es keine gute Möglichkeit gibt, Attributnamen in der Modellquelldatei zu deklarieren, sondern ein Terminal offen zu halten und die Objekte anzustupsen, um ihre Eigenschaften herauszufinden. – gbc

Antwort

219

Für Schema bezogenes

Model.column_names   
Model.columns_hash   
Model.columns 

Zum Beispiel Variablen/Attribute in einem AR-Objekt

object.attribute_names      
object.attribute_present?   
object.attributes 

Zum Beispiel Methoden ohne Vererbung von Superklasse

Model.instance_methods(false) 
+9

Um die Assoziationen auch zu bekommen, können Sie tun: Model.reflect_on_all_associations.map (&: name) – Filippos

+1

In ActiveRecord 5 (und wahrscheinlich früher) können Sie 'Model.attribute_names' aufrufen. – aceofbassgreg

4
some_instance.attributes 

Quelle: blog

+0

some_class.attributes.Schlüssel ist ein wenig sauberer – klochner

+0

frage mich, ob IDEs dies für Autovervollständigung verwenden? Scheint wie eine offensichtliche Sache für ein Schienenmodell zu tun. Ich bin immer enttäuscht, wenn ich einen Attributnamen eintippe und er nicht automatisch vervollständigt wird. – frankodwyer

+7

Da 'attributes' eine Instanzmethode ist, würde das korrekte Codebeispiel' some_instance.attributes' heißen. – RocketR

24

Es gibt eine Schiene genannt Beschriften Modelle Plugin, die Ihr Modell Attribut hier auf der Spitze Ihrer Modelldateien generieren ist der Link:

https://github.com/ctran/annotate_models

Um die Annotation synchron zu halten, können Sie eine Aufgabe schreiben, um Annotatmodelle nach jeder Implementierung neu zu generieren.

+3

Neue Seite für das, was ich vermute, ist das gleiche Plugin, https://github.com/ctran/annotate_models –

9

Wenn Sie nur interessiert an den Eigenschaften und Datentypen aus der Datenbank, können Sieverwenden.

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)" 

Alternativ haben rake db:create und rake db:migrate für Ihre Entwicklungsumgebung ausführen, um die Datei db/schema.rb die maßgebliche Quelle für die Datenbankstruktur enthalten:

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

Modell zu beschreiben, ich verwende folgende Ausschnitt

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

Wieder ist dies, wenn Sie einen schönen Druck suchen, um Sie zu beschreiben ActiveRecord, ohne dass Sie Migrationen machen oder den Entwickler hüpfen, bevor Sie in Attributen kommentieren konnten.

+0

Dies ist perfekt für den Ausdruck aller Attribute aller Instanzen für ein bestimmtes Modell - danke! – ConorB

Verwandte Themen