Wie erkennen Sie Modellattribute in Rails?

142

Es fällt mir schwer, leicht zu erkennen, welche Attribute / Eigenschaften in allen meinen Modellklassen vorhanden sind, da sie in meinen Klassendateien nicht explizit definiert sind.

Um Modellattribute zu ermitteln, lasse ich die Datei schema.rb geöffnet und wechsle zwischen ihr und dem Code, den ich nach Bedarf schreibe. Dies funktioniert, ist jedoch umständlich, da ich zwischen dem Lesen der Schemadatei zum Abrufen von Attributen, der Modellklassendatei zum Überprüfen von Methoden und dem neuen Code, den ich zum Aufrufen von Attributen und Methoden schreibe, wechseln muss.

Meine Frage ist, wie Sie Modellattribute entdecken, wenn Sie zum ersten Mal eine Rails-Codebasis analysieren. Halten Sie die Datei schema.rb ständig geöffnet, oder gibt es einen besseren Weg, bei dem nicht ständig zwischen Schemadatei und Modelldatei gewechselt wird?

gbc
quelle
7
Danke für die Antworten unten. Es hört sich so an, als gäbe es keine gute Möglichkeit, Attributnamen in der Modellquelldatei zu deklarieren, sondern ein Terminal offen zu halten und die Objekte zu stupsen, um ihre Eigenschaften herauszufinden.
GBC

Antworten:

276

Für schemabezogene Sachen

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 Super Class

Model.instance_methods(false)
Penger
quelle
10
Um auch die Assoziationen zu erhalten, können Sie Folgendes tun: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
In ActiveRecord 5 (und wahrscheinlich früher) können Sie anrufen Model.attribute_names.
Aceofbassgreg
27

Es gibt ein Rails-Plugin namens Annotate Models, das Ihre Modellattribute oben in Ihren Modelldateien generiert. Hier ist der Link:

https://github.com/ctran/annotate_models

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

ez.
quelle
3
Neue Seite für das, was ich
James McMahon
15

Wenn Sie nur an den Eigenschaften und Datentypen aus der Datenbank interessiert sind, können Sie verwenden 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)"

Alternativ enthält die Datei nach dem Ausführen rake db:createund rake db:migratefür Ihre Entwicklungsumgebung db/schema.rbdie maßgebliche Quelle für Ihre Datenbankstruktur:

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
Nick
quelle
10

Um das Modell zu beschreiben, verwende ich das folgende Snippet

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

Auch dies ist der Fall, wenn Sie einen hübschen Ausdruck suchen, um Sie zu beschreiben, ActiveRecordohne dass Sie Migrationen durchlaufen oder diesen Entwickler hüpfen müssen, bevor Sie nett genug waren, um Attribute zu kommentieren.

Haris Krajina
quelle
Dies ist perfekt, um alle Attribute aller Instanzen für ein bestimmtes Modell auszudrucken - danke!
ConorB
4
some_instance.attributes

Quelle: Blog

mcandre
quelle
some_class.attributes.keys ist ein wenig sauberer
klochner
Frage mich, ob IDEs dies für die automatische Vervollständigung verwenden? Scheint eine naheliegende Sache für ein Schienenmodell zu sein. Ich bin immer enttäuscht, wenn ich einen Attributnamen eingebe, der nicht automatisch vervollständigt wird.
Frankodwyer
2
@frankodwyer - RubyMine tut, obwohl ich sicher bin, dass es andere geben muss.
Matt