2009-03-31 29 views
8

Si tiene asociaciones polimórficas belongs_to continuación referencias añadirán las dos columnas necesarias:asociación polimórfica

create_table :products do |t| 
    t.references :attachment, :polymorphic => {:default => 'Photo'} 
end 

añadirá una columna attachment_id y una columna de cadena attachment_type con un valor por defecto de ‘foto’.

¿Qué significa exactamente?

Respuesta

4

Básicamente, la asociación polimórfica, por definición, añade la capacidad para crear asociaciones con muchos otros modelos rieles ActiveRecord.

Ambas columnas le permiten a Rails saber a qué modelo se refiere la asociación, tiene la columna attachment_type (es decir, String) (el valor predeterminado es "Photo", table-name: photos en db), y attachment_id es una especie de clave externa para ese Modelo/tabla en particular (es decir, Foto).

Por lo general, esto le proporciona flexibilidad para asociar un modelo a muchos otros.

0

polimórfico significa que puede pertenecer a diferentes objetos (o, registros diferentes en tablas diferentes). La forma en que determina esto se basa en los campos de tipo e id. Si su asociación no fuera polimórfica, solo tendría un campo _id.

+0

Solo quería saber qué sucede en el nivel de la base de datos cuando ejecuto la migración. – Arc

6

Aquí está la documentación sobre el método de referencias: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001938

El código del método de referencias es el siguiente:

497:  def references(*args) 
498:   options = args.extract_options! 
499:   polymorphic = options.delete(:polymorphic) 
500:   args.each do |col| 
501:   column("#{col}_id", :integer, options) 
502:   column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil? 
503:   end 
504:  end 

Como se puede ver. Agrega una columna [col] _id y [col] _type a la tabla.

¡Es lo mismo que decir:

create_table :products do |t| 
    t.integer :attachment_id 
    t.string :attachment_type, :default => 'Photo' 
end 

asociaciones polimórficas se utilizan para conectar un tipo de objetos a varios tipos de otros objetos.

Un buen ejemplo podría ser una aplicación que admita etiquetas, donde las etiquetas se pueden conectar tanto a Products como a Categories.

En su ejemplo, parece que los Productos se pueden unir a varios tipos de objetos, donde el tipo de objeto predeterminado es una Foto. (attachment_type habría "Foto", y attachment_id sería un id de una fila en la tabla 'fotos')

+0

attachment_type column ¿Cómo se da cuenta de que se debe utilizar la columna attachment_type? – Arc

+0

eso es básicamente magia mágica –

Cuestiones relacionadas