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?


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)

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


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

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.