2009-08-17 14 views
107

Comencé mi primera aplicación de Rails el otoño pasado y tuve que ponerla en el estante durante unos meses cuando pagaba todo el tiempo que estaba haciendo el trabajo. Ahora estoy interesado en volver al proyecto y leer el código para descubrir dónde lo dejé.¿Cómo se descubren los atributos del modelo en Rails

El hecho de que Rails crea dinámicamente atributos de modelo en el tiempo de ejecución ahorra mucho tipado repetitivo, pero me resulta difícil descubrir qué atributos/propiedades existen en todas mis clases de modelo ya que no están explícitamente definidos en mi clase archivos. Para descubrir los atributos del modelo, mantengo el archivo schema.rb abierto y giro entre él y el código que estoy escribiendo que usa las propiedades de un modelo. Esto funciona, pero es torpe porque tengo que leer el archivo de esquema para recoger los atributos, el archivo de clase de modelo para recoger los métodos, y cualquier código nuevo que estoy escribiendo para llamar a los atributos & métodos.

Así que mi pregunta es, ¿cómo descubres las propiedades del modelo cuando estás analizando una base de código de Rails por primera vez? ¿Mantiene el archivo schema.rb abierto todo el tiempo, o hay una forma mejor de que no se salte constantemente entre archivos de esquema del archivo de esquema &?

+6

Gracias por las respuestas a continuación. Parece que no hay una buena forma de declarar nombres de atributos en el archivo fuente del modelo, sino mantener un terminal abierto y examinar los objetos para descubrir sus propiedades. – gbc

Respuesta

219

para el esquema de cosas relacionadas

Model.column_names   
Model.columns_hash   
Model.columns 

Para las variables de instancia/atributos de un objeto AR

object.attribute_names      
object.attribute_present?   
object.attributes 

Para los métodos de instancia y sin herencia de superclase

Model.instance_methods(false) 
+9

Para obtener las asociaciones también puede hacer: Model.reflect_on_all_associations.map (&: name) – Filippos

+1

En ActiveRecord 5 (y probablemente antes) puede llamar a 'Model.attribute_names'. – aceofbassgreg

4
some_instance.attributes 

Fuente: blog

+0

some_class.attributes.claves es un poco más limpio – klochner

+0

se preguntan si los IDEs utilizan esto para la autocompletación? Parece una cosa obvia que hacer para un modelo de rieles. Siempre me decepciona cuando empiezo a escribir un nombre de atributo y no se autocompleta. – frankodwyer

+7

Dado que 'attributes' es un método de instancia, el ejemplo de código correcto diría' some_instance.attributes'. – RocketR

24

hay un raíles plugin llamado modelos de anotar, que va a generar sus atributos de modelo en la parte superior de los 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 anotación después de cada implementación.

+3

Nuevo sitio para lo que supongo que es el mismo complemento, https://github.com/ctran/annotate_models –

9

Si eres solo 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)" 

alternativa, de haber corrido 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 
8

Para describir el modelo que utilizo siguiente fragmento

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

De nuevo, esto es si lo que buscas es bastante estampado para describirte ActiveRecord sin ir a través de migraciones o saltar a ese desarrollador antes de que fue lo suficientemente amable como para comentar los atributos.

+0

Esto es perfecto para imprimir todos los atributos de todas las instancias de un modelo en particular, ¡gracias! – ConorB

Cuestiones relacionadas