¿Cómo se descubren los atributos del modelo en Rails?

142

Me resulta difícil ver fácilmente qué atributos / propiedades existen en todas mis clases de modelo, ya que no están definidas explícitamente en mis archivos de clase.

Para descubrir los atributos del modelo, mantengo el archivo schema.rb abierto y cambio entre él y cualquier código que esté escribiendo según sea necesario. Esto funciona pero es torpe porque tengo que cambiar entre leer el archivo de esquema para recoger atributos, el archivo de clase de modelo para verificar métodos y cualquier código nuevo que estoy escribiendo para llamar a atributos y métodos.

Mi pregunta es, ¿cómo descubre los atributos del modelo cuando analiza una base de código Rails por primera vez? ¿Mantiene el archivo schema.rb abierto todo el tiempo, o hay una mejor manera que no implique saltar constantemente entre el archivo de esquema y el archivo de modelo?

gbc
fuente
77
Gracias por las respuestas a continuación. Parece que no hay una buena manera de declarar nombres de atributos en el archivo fuente del modelo, sino más bien mantener un terminal abierto y pinchar los objetos para descubrir sus propiedades.
gbc

Respuestas:

276

Para cosas relacionadas con el esquema

Model.column_names         
Model.columns_hash         
Model.columns 

Por ejemplo, variables / atributos en un objeto AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Por ejemplo, métodos sin herencia de superclase

Model.instance_methods(false)
penger
fuente
10
Para obtener las asociaciones también puede hacer: Model.reflect_on_all_associations.map (&: name)
vasilakisfil
1
En ActiveRecord 5 (y probablemente antes) puede llamar Model.attribute_names.
aceofbassgreg
27

Hay un complemento de rieles llamado Anotar modelos, que generará los atributos de su modelo en la parte superior de sus archivos de modelo. Aquí está el enlace:

https://github.com/ctran/annotate_models

Para mantener la anotación sincronizada, puede escribir una tarea para volver a generar modelos de anotaciones después de cada implementación.

ez.
fuente
3
Nuevo sitio para lo que supongo que es el mismo complemento, github.com/ctran/annotate_models
James McMahon
15

Si solo está interesado en las propiedades y los tipos de datos de la base de datos, puede 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)"

Alternativamente, después de ejecutar rake db:createy rake db:migratepara su entorno de desarrollo, el archivo db/schema.rbcontendrá la fuente autorizada para la estructura de su base de datos:

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
Mella
fuente
10

Para describir el modelo, uso el siguiente fragmento

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

De nuevo, esto es si está buscando una impresión bonita para describirlo ActiveRecordsin tener que pasar por migraciones o saltar a ese desarrollador antes de que fuera lo suficientemente amable como para comentar los atributos.

Haris Krajina
fuente
Esto es perfecto para imprimir todos los atributos de todas las instancias para un modelo en particular, ¡gracias!
ConorB
4
some_instance.attributes

Fuente: blog

mcandre
fuente
some_class.attributes.keys es un poco más limpio
klochner
¿se pregunta si algún IDE usa esto para autocompletar? Parece algo obvio para un modelo de rieles. Siempre estoy decepcionado cuando comienzo a escribir un nombre de atributo y no se completa automáticamente.
frankodwyer
2
@frankodwyer - RubyMine lo hace, aunque estoy seguro de que debe haber otros.
Matt