Bagaimana Anda menemukan atribut model di Rails?

142

Saya merasa sulit untuk dengan mudah melihat atribut / properti apa yang ada pada semua kelas model saya karena mereka tidak secara eksplisit didefinisikan dalam file kelas saya.

Untuk menemukan atribut model, saya membiarkan file schema.rb tetap terbuka dan beralih di antaranya dan kode apa pun yang saya tulis sesuai kebutuhan. Ini berfungsi tetapi kikuk karena saya harus beralih antara membaca file skema untuk mengambil atribut, file kelas model untuk memeriksa metode, dan kode baru apa pun yang saya tulis untuk memanggil atribut & metode.

Pertanyaan saya adalah, bagaimana Anda menemukan atribut model ketika Anda menganalisis basis kode Rails untuk pertama kalinya? Apakah Anda membiarkan file schema.rb tetap terbuka sepanjang waktu, atau adakah cara yang lebih baik yang tidak melibatkan lompatan antara file skema & file model secara konstan?

gbc
sumber
7
Terima kasih atas jawaban di bawah ini. Kedengarannya seperti tidak ada cara yang baik untuk mendeklarasikan nama-nama atribut dalam file source model, melainkan menjaga terminal terbuka dan menyodok objek untuk mengetahui sifat-sifatnya.
gbc

Jawaban:

276

Untuk hal-hal terkait Skema

Model.column_names         
Model.columns_hash         
Model.columns 

Misalnya variabel / atribut dalam objek AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Misalnya metode tanpa warisan dari kelas super

Model.instance_methods(false)
penger
sumber
10
Untuk mendapatkan asosiasi juga, Anda dapat melakukan: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
Dalam ActiveRecord 5 (dan mungkin sebelumnya) Anda dapat menelepon Model.attribute_names.
aceofbassgreg
27

Ada plugin rails yang disebut Annotate models, yang akan menghasilkan atribut model Anda di bagian atas file model Anda di sini adalah tautannya:

https://github.com/ctran/annotate_models

untuk menjaga anotasi dalam sinkronisasi, Anda dapat menulis tugas untuk menghasilkan kembali model anotasi setelah setiap penyebaran.

mis.
sumber
3
Situs baru untuk apa yang saya asumsikan adalah plugin yang sama, github.com/ctran/annotate_models
James McMahon
15

Jika Anda hanya tertarik pada properti dan tipe data dari database, Anda dapat menggunakannya 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)"

Atau, setelah menjalankan rake db:createdan rake db:migrateuntuk lingkungan pengembangan Anda, file tersebut db/schema.rbakan berisi sumber otoritatif untuk struktur database Anda:

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
sumber
10

Untuk menjelaskan model, saya menggunakan cuplikan berikut

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

Sekali lagi ini adalah jika Anda mencari cetakan yang cukup untuk menggambarkan Anda ActiveRecordtanpa Anda akan melalui migrasi atau melompat pengembang itu sebelum Anda cukup baik untuk berkomentar di atribut.

Haris Krajina
sumber
Ini sempurna untuk mencetak semua atribut dari semua instance untuk model tertentu - terima kasih!
ConorB
4
some_instance.attributes

Sumber: blog

mcandre
sumber
some_class.attributes.keys adalah sedikit lebih bersih
klochner
bertanya-tanya apakah ada IDE yang menggunakan ini untuk pelengkapan otomatis? Sepertinya hal yang jelas dilakukan untuk model rel. Saya selalu kecewa ketika saya mulai mengetik nama atribut dan tidak lengkap secara otomatis.
frankodwyer
2
@frankodwyer - RubyMine tidak, meskipun saya yakin pasti ada yang lain.
Matt