Rails'teki model özelliklerini nasıl keşfedersiniz?


142

Sınıf dosyalarında açıkça tanımlanmadığı için tüm model sınıflarımda hangi özniteliklerin / özelliklerin var olduğunu kolayca görmek zor buluyorum.

Model özniteliklerini keşfetmek için schema.rb dosyasını açık tutuyorum ve gerektiği gibi yazdığım kod arasında geçiş yapıyorum. Bu çalışır, ancak tıknaz çünkü öznitelikleri almak için şema dosyasını okuma, yöntemleri kontrol etmek için model sınıfı dosyası ve öznitelikleri ve yöntemleri aramak için yazdığım her yeni kod arasında geçiş yapmak zorundayım.

Benim sorum, Rails kod tabanını ilk kez analiz ederken model niteliklerini nasıl keşfedersiniz? Schema.rb dosyasını her zaman açık tutuyor musunuz, yoksa sürekli şema dosyası ve model dosyası arasında atlamayı içermeyen daha iyi bir yol var mı?


7
Aşağıdaki cevaplar için teşekkürler. Model kaynak dosyasında öznitelik adlarını bildirmenin iyi bir yolu yok gibi görünüyor, bunun yerine bir terminali açık tutun ve özelliklerini bulmak için nesneleri dürtün.
gbc

Yanıtlar:


276

Şema ile ilgili şeyler için

Model.column_names         
Model.columns_hash         
Model.columns 

Örneğin bir AR nesnesindeki değişkenler / öznitelikler

object.attribute_names                    
object.attribute_present?          
object.attributes

Örneğin, süper sınıftan miras alınmayan yöntemler

Model.instance_methods(false)

10
Dernekleri de almak için şunları yapabilirsiniz: Model.reflect_on_all_associations.map (&: name)
vasilakisfil

1
ActiveRecord 5'te (ve muhtemelen daha önce) arayabilirsiniz Model.attribute_names.
aceofbassgreg


15

Veritabanındaki özellikler ve veri türleriyle ilgileniyorsanız, kullanabilirsiniz 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)"

Alternatif olarak, çalıştırdığınız rake db:createve rake db:migrategeliştirme ortamınız için, dosya db/schema.rbveritabanı yapınız için yetkili kaynağı içerecektir:

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

Modeli tanımlamak için aşağıdaki kod parçasını kullanıyorum

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

Yine, bu özellik, ActiveRecordtaşıma işlemlerine gitmeden veya niteliklere yorum yapmak için yeterince güzel olmadan önce bu geliştiriciyi atlatmadan sizi tanımlamak için oldukça baskı arıyorsanız .


Bu, belirli bir model için tüm örneklerin tüm özelliklerini yazdırmak için mükemmeldir - teşekkürler!
ConorB

4
some_instance.attributes

Kaynak: blog


some_class.attributes.keys biraz temiz
klochner

IDE'lerin bunu otomatik tamamlama için kullanıp kullanmadığını merak ediyor musunuz? Bir ray modeli için yapılacak bariz bir şey gibi görünüyor. Bir özellik adı yazmaya başladığımda her zaman hayal kırıklığına uğradım ve otomatik olarak tamamlanmıyor.
frankodwyer

2
@frankodwyer - RubyMine yapar, ancak başkalarının olması gerektiğinden eminim.
Matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.