¿Cómo descubrir atributos de modelo en Rails?


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

Para descubrir los atributos del modelo, conservo el esquema.rb archivo abierto y voltear entre él y cualquier código que estoy escribiendo según sea necesario. Esto funciona, pero es torpe porque tengo que cambiar entre la lectura del archivo de esquema para recoger los atributos, el archivo de clase del modelo para comprobar los métodos, y cualquier código nuevo que estoy escribiendo para llamar atributos y métodos.

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

Author: Aerovistae, 2009-08-17

5 answers

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)
 236
Author: penger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 08:14:40

Existe un plugin de rails llamado Annotate models, que generará los atributos del modelo en la parte superior de los archivos del 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.

 25
Author: ez.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-24 17:21:34

Si solo está interesado en las propiedades y 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:create y rake db:migrate para su entorno de desarrollo, el archivo db/schema.rb contendrá 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
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-13 11:22:45

Para describir el modelo utilizo el siguiente fragmento

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

De nuevo, esto es si estás buscando una impresión bonita para describirte ActiveRecord sin que vayas a través de migraciones o saltes ese desarrollador antes de que fuera lo suficientemente agradable como para comentar en atributos.

 8
Author: Haris Krajina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 13:39:37
some_instance.attributes

Fuente: blog

 4
Author: mcandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 18:51:36