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?
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. –
Ahh, puedo ver. Déjame probar una edición. – Chowlett
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! –