Jak odkrywasz atrybuty modelu w Railsach?

142

Trudno mi łatwo zobaczyć, jakie atrybuty / właściwości istnieją we wszystkich moich klasach modelu, ponieważ nie są one jawnie zdefiniowane w moich plikach klas.

Aby odkryć atrybuty modelu, otwieram plik schema.rb i przełączam go między nim a kodem, który piszę w razie potrzeby. To działa, ale jest niezgrabne, ponieważ muszę przełączać się między czytaniem pliku schematu, aby wybrać atrybuty, plikiem klasy modelu, aby sprawdzić metody, i jakimkolwiek nowym kodem, który piszę, aby wywołać atrybuty i metody.

Moje pytanie brzmi: w jaki sposób odkrywasz atrybuty modelu, kiedy analizujesz bazę kodu Railsów po raz pierwszy? Czy cały czas otwierasz plik schema.rb, czy jest lepszy sposób, który nie wymaga ciągłego przeskakiwania między plikiem schematu a plikiem modelu?

gbc
źródło
7
Dzięki za odpowiedzi poniżej. Wygląda na to, że nie ma dobrego sposobu na zadeklarowanie nazw atrybutów w pliku źródłowym modelu, ale raczej pozostawienie otwartego terminala i przeglądanie obiektów, aby znaleźć ich właściwości.
gbc

Odpowiedzi:

276

Dla rzeczy związanych ze schematem

Model.column_names         
Model.columns_hash         
Model.columns 

Na przykład zmienne / atrybuty w obiekcie AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Na przykład metody bez dziedziczenia z superklasy

Model.instance_methods(false)
penger
źródło
10
Aby uzyskać skojarzenia, możesz również zrobić: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
W ActiveRecord 5 (i prawdopodobnie wcześniej) możesz zadzwonić Model.attribute_names.
aceofbassgreg
27

Istnieje wtyczka rails o nazwie Annotate models, która wygeneruje atrybuty twojego modelu w górnej części plików modeli, tutaj jest link:

https://github.com/ctran/annotate_models

aby zachować synchronizację adnotacji, możesz napisać zadanie ponownego generowania modeli adnotacji po każdym wdrożeniu.

ez.
źródło
3
Nowa strona dla tego, co zakładam, to ta sama wtyczka, github.com/ctran/annotate_models
James McMahon
15

Jeśli interesują Cię tylko właściwości i typy danych z bazy danych, możesz użyć 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)"

Alternatywnie, po uruchomieniu rake db:createi rake db:migratedla twojego środowiska programistycznego, plik db/schema.rbbędzie zawierał autorytatywne źródło struktury bazy danych:

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
Nacięcie
źródło
10

Do opisu modelu posłużę się następującym fragmentem

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

Znowu tak jest, jeśli szukasz ładnego wydruku, aby opisać Cię ActiveRecordbez przechodzenia przez migracje lub przeskakiwania tego programisty, zanim byłeś wystarczająco miły, aby komentować atrybuty.

Haris Krajina
źródło
Jest to idealne rozwiązanie do wydrukowania wszystkich atrybutów wszystkich instancji dla konkretnego modelu - dzięki!
ConorB
4
some_instance.attributes

Źródło: blog

mcandre
źródło
Some_class.attributes.keys jest trochę czystszy
klochner
zastanawiam się, czy jakieś IDE używają tego do autouzupełniania? Wydaje się, że to oczywista rzecz dla modelu szynowego. Zawsze jestem rozczarowany, gdy zaczynam wpisywać nazwę atrybutu i nie jest ona automatycznie uzupełniana.
frankodwyer
2
@frankodwyer - RubyMine tak, chociaż jestem pewien, że muszą być inni.
Matt