Как вы обнаруживаете атрибуты модели в Rails?

146

Мне трудно легко увидеть, какие атрибуты / свойства существуют во всех моих классах модели, поскольку они явно не определены в моих файлах классов.

Чтобы обнаружить атрибуты модели, я держу файл schema.rb открытым и переключаюсь между ним и любым кодом, который пишу по мере необходимости. Это работает, но неуклюже, потому что мне нужно переключаться между чтением файла схемы, чтобы выбрать атрибуты, файлом класса модели для проверки методов и любым новым кодом, который я пишу для вызова атрибутов и методов.

У меня вопрос: как вы обнаруживаете атрибуты модели, когда впервые анализируете кодовую базу Rails? Вы все время держите файл schema.rb открытым или есть лучший способ, который не предполагает постоянного переключения между файлом схемы и файлом модели?

gbc
источник
7
Спасибо за ответы ниже. Похоже, что нет хорошего способа объявлять имена атрибутов в исходном файле модели, а лучше держать терминал открытым и высовывать объекты, чтобы узнать их свойства.
gbc

Ответы:

280

Для материалов, связанных со схемой

Model.column_names         
Model.columns_hash         
Model.columns 

Например, переменные / атрибуты в объекте AR

object.attribute_names                    
object.attribute_present?          
object.attributes

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

Model.instance_methods(false)
Penger
источник
10
Чтобы получить ассоциации, вы также можете сделать: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
В ActiveRecord 5 (и, вероятно, ранее) вы можете позвонить Model.attribute_names.
aceofbassgreg
29

Существует плагин рельсов под названием Annotate models, который будет генерировать атрибуты вашей модели в верхней части ваших файлов модели, вот ссылка:

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
Ник
источник
11

Для описания модели я использую следующий фрагмент

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

Опять же, это если вы выглядите довольно печатно, чтобы описать вас, ActiveRecordне проходя через миграцию или переходя к этому разработчику, прежде чем вы были достаточно любезны, чтобы комментировать атрибуты.

Харис Краина
источник
Это идеально подходит для печати всех атрибутов всех экземпляров конкретной модели - спасибо!
ConorB 03
4
some_instance.attributes

Источник: блог

Макандре
источник
1
some_class.attributes.keys стал немного чище
klochner
интересно, используют ли это IDE для автозаполнения? Кажется очевидным, что делать для рельсовой модели. Я всегда разочаровываюсь, когда начинаю вводить имя атрибута, а оно не заполняется автоматически.
frankodwyer
2
@frankodwyer - RubyMine знает, хотя я уверен, что должны быть и другие.
Мэтт