2012-03-23 13 views
12

Tengo un producto y un producto puede tener muchas imágenes. Esto es a través de una tabla de asociaciones. Sin embargo, me gustaría que un producto tenga una imagen principal.rails has_one de una asociación has_many

Sé que esto es muy fácil de hacer con un método en el modelo, pero quiero que sea una asociación para que pueda precargarlo en la consulta usando include.

Modelos:

class Product < ActiveRecord::Base 
    has_many :image_associations, :as => :imageable 
    has_many :images, :through => :image_associations 
end 

class ImageAssociation < ActiveRecord::Base 
    belongs_to :image 
    belongs_to :imageable, :polymorphic => true 
end 

class Image < ActiveRecord::Base 
    has_many :image_associations 
end 

En la tabla ImageAssociation, hay una columna boolean llamado 'característica' que asocia una imagen como la imagen 'principal'.

Una de las maneras que he pensado en hacer esto es la adición de una columna main_image_id a la mesa de productos, y luego añadiendo al modelo Image:

belongs_to :image, :class => "Image", :foreign_key => "main_image_id" 

Sin embargo, esto no permite ningún repliegue el otro tiene muchas imágenes si la imagen principal es nula, y me gustaría que la asociación se cargue.

por lo que me esperaba algo en el modelo de imágenes como:

has_one :image, :through => :images, :conditions => 'feature = true', :order => 'created_at DESC' 

Pero eso me da un error asociación.

¿Hay alguna forma de que yo edite eso_, o realmente necesito ejecutar una tarea de rake para insertar una imagen en cada campo main_image_id y luego agregar una validación para futuros productos para asegurarme de que se haya agregado una imagen principal? ?

EDIT:

debo utilizar una asociación has_and_belongs_to_many en su lugar?

Respuesta

13

Creo que estás casi allí, aunque no estoy tan claro sobre las asociaciones polimórficas. Creo que quiere lo siguiente:

has_one :main_image_assoc, class => "ImageAssociation", :conditions => 'feature = true', :order => 'created_at DESC', :as => :imageable 
has_one :image, :through => :main_image_assoc 
+0

Nope. Puede hacer eso con otras asociaciones has_many filtradas para la colección si lo desea, pero no especifica un has_one. Este error ocurre: 'ActiveRecord :: HasOneThroughCantAssociateThroughCollection: no puede tener un has_one: a través de la asociación 'Article # image' donde: a través de la asociación 'Article # image_associations' es una colección. Especifique una asociación has_one o belongs_to en la opción: through en su lugar. Ya lo había intentado. –

+0

Ahh, puedo ver. Déjame probar una edición. – Chowlett

+1

Corrección a la primera línea- ': has_one: main_image_assoc,: class_name =>" ImageAssociation ",: order => 'feature = true',: as =>: imageable' ... esto permite un repliegue (y la sintaxis correcta) . ¡Gracias! –

Cuestiones relacionadas