Як ви виявите атрибути моделі в Rails?


142

Мені важко легко зрозуміти, які атрибути / властивості існують у всіх моїх модельних класах, оскільки вони чітко не визначені у файлах мого класу.

Щоб виявити атрибути моделі, я тримаю файл schema.rb відкритим і перемикаю його між собою та будь-яким кодом, який я пишу, якщо потрібно. Це працює, але химерно, тому що я повинен перемикатися між читанням файлу схеми, щоб отримати атрибути, файл класу моделі, щоб перевірити методи, і будь-який новий код, який я пишу, щоб викликати атрибути та методи.

Моє запитання полягає в тому, як ви виявите атрибути моделі під час першого аналізу кодової бази Rails? Чи постійно ви тримаєте файл schema.rb відкритим, чи є кращий спосіб, який не передбачає постійного переходу між файлами схеми та файлом моделі?


7
Дякуємо за відповіді нижче. Здається, що не існує гарного способу оголосити імена атрибутів у вихідному файлі моделі, а краще тримати термінал відкритим і ткнути об'єкти, щоб дізнатися їх властивості.
gbc

Відповіді:


276

Для матеріалів, пов’язаних із схемами

Model.column_names         
Model.columns_hash         
Model.columns 

Наприклад, змінні / атрибути в об'єкті AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Наприклад, методи без успадкування від суперкласу

Model.instance_methods(false)

10
Для отримання асоціацій ви також можете зробити: Model.reflect_on_all_associations.map (&: name)
vasilakisfil

1
У ActiveRecord 5 (і, можливо, раніше) ви можете зателефонувати Model.attribute_names.
aceofbassgreg

27

Існує плагін рейлів під назвою Анотація моделей, який генерує ваші атрибути моделі у верхній частині файлів вашої моделі. Тут посилання:

https://github.com/ctran/annotate_models

щоб зберегти анотацію синхронізовано, ви можете написати завдання для повторного генерування моделей анотації після кожного розгортання.


3
Новий сайт, на який я припускаю, - той самий плагін, github.com/ctran/annotate_models
Джеймс Макмахон

15

Якщо вас просто цікавлять властивості та типи даних із бази даних, ви можете використовувати 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)"

Як варіант, запустивши rake db:createі rake db:migrateдля вашого середовища розробки, файл db/schema.rbбуде містити авторитетне джерело для структури вашої бази даних:

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

Для опису моделі я використовую наступний фрагмент

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

Знову ж таки, це якщо ви шукаєте досить принт, щоб описати вас, ActiveRecordне переходячи міграції чи скакаючи цього розробника, перш ніж вам було приємно прокоментувати атрибути.


Це ідеально підходить для друку всіх атрибутів усіх екземплярів для конкретної моделі - дякую!
ConorB

4
some_instance.attributes

Джерело: блог


some_class.attributes.keys трохи чистіше
klochner

цікаво, чи використовують якісь IDE це для автозавершення? Здається, очевидно, що потрібно зробити для моделі рейок. Я завжди розчарований, коли починаю вводити ім'я атрибута, і воно не заповнюється автоматично.
frankodwyer

2
@frankodwyer - RubyMine робить, хоча я впевнений, що мають бути й інші.
Метт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.