У меня есть продукт, а продукт может иметь много изображений. Это через таблицу ассоциаций. Однако я бы хотел, чтобы у продукта было одно основное изображение.
Я знаю, что это очень легко сделать с помощью метода в модели, но я хочу, чтобы это была ассоциация, чтобы я мог предварительно загрузить ее в запрос, используя include
.
Модели:
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
В таблице ImageAssociation есть логический столбец под названием «feature», который связывает изображение с «основным» изображением.
Один из способов сделать это, как я думал, состоит в том, чтобы добавить столбец main_image_id
в таблицу products, а затем добавить в модель Image
:
belongs_to :image, :class => "Image", :foreign_key => "main_image_id"
Однако это не допускает никакого отката к другим изображениям has_many, если основное изображение равно нулю, что я хотел бы, чтобы ассоциация загружалась.
Вот почему я надеялся на что-то в модели изображений, например:
has_one :image, :through => :images, :conditions => 'feature = true', :order => 'created_at DESC'
Но это дает мне ошибку ассоциации.
Можно ли как-то отредактировать это has_one, или мне действительно нужно запустить задачу rake, чтобы вставить изображение в каждое поле main_image_id, а затем добавить проверку для будущих продуктов, чтобы убедиться, что основное изображение было добавлено?
РЕДАКТИРОВАТЬ:
Должен ли я вместо этого использовать ассоциацию has_and_belongs_to_many
?