¿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?


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)

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


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

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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.