Como você descobre atributos de modelo no Rails?

142

Estou achando difícil ver facilmente quais atributos / propriedades existem em todas as minhas classes de modelo, pois elas não estão explicitamente definidas nos meus arquivos de classe.

Para descobrir os atributos do modelo, mantenho o arquivo schema.rb aberto e alterno entre ele e o código que estou escrevendo conforme necessário. Isso funciona, mas é desajeitado porque eu tenho que alternar entre ler o arquivo de esquema para selecionar atributos, o arquivo de classe do modelo para verificar métodos e qualquer novo código que estou escrevendo para chamar atributos e métodos.

Minha pergunta é: como você descobre os atributos do modelo ao analisar uma base de código do Rails pela primeira vez? Você mantém o arquivo schema.rb aberto o tempo todo ou existe uma maneira melhor que não envolva alternar constantemente entre o arquivo de esquema e o arquivo de modelo?

gbc
fonte
7
Obrigado pelas respostas abaixo. Parece que não há uma boa maneira de declarar nomes de atributos no arquivo de origem do modelo, mas mantenha um terminal aberto e cutucar os objetos para descobrir suas propriedades.
gbc 20/08/09

Respostas:

276

Para coisas relacionadas ao esquema

Model.column_names         
Model.columns_hash         
Model.columns 

Por exemplo, variáveis ​​/ atributos em um objeto AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Por exemplo, métodos sem herança da super classe

Model.instance_methods(false)
penger
fonte
10
Para obter as associações também você pode fazer: Model.reflect_on_all_associations.map (&: nome)
vasilakisfil
1
No ActiveRecord 5 (e provavelmente antes), você pode ligar Model.attribute_names.
Aceofbassgreg 22/09/16
27

Existe um plug-in rails chamado Annotate models, que irá gerar os atributos do seu modelo na parte superior dos arquivos do seu modelo, aqui está o link:

https://github.com/ctran/annotate_models

para manter a anotação sincronizada, você pode escrever uma tarefa para gerar novamente modelos de anotação após cada implantação.

ez.
fonte
3
Novo site para que eu assumo é o mesmo plugin, github.com/ctran/annotate_models
James McMahon
15

Se você está interessado apenas nas propriedades e tipos de dados do banco de dados, pode usar 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)"

Como alternativa, tendo executado rake db:createe rake db:migratepara o seu ambiente de desenvolvimento, o arquivo db/schema.rbconterá a fonte autorizada para sua estrutura de banco de dados:

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
usuario
fonte
10

Para descrever o modelo, eu uso o seguinte trecho

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

Novamente, isso é se você estiver procurando uma boa impressão para descrevê-lo ActiveRecordsem passar por migrações ou pular esse desenvolvedor antes de ser legal o suficiente para comentar em atributos.

Haris Krajina
fonte
Isso é perfeito para imprimir todos os atributos de todas as instâncias de um modelo específico - obrigado!
ConorB
4
some_instance.attributes

Fonte: blog

mcandre
fonte
some_class.attributes.keys é um pouco mais limpo
klochner
Será que algum IDE usa isso para o preenchimento automático? Parece uma coisa óbvia a se fazer em um modelo de trilhos. Sempre fico decepcionado quando começo a digitar um nome de atributo e ele não é preenchido automaticamente.
frankodwyer
2
@frankodwyer - RubyMine faz, embora eu "tenho certeza que deve haver outros.
Matt