rails has_one из ассоциации has_many - PullRequest
15 голосов
/ 23 марта 2012

У меня есть продукт, и у продукта может быть много изображений. Это через таблицу ассоциаций. Однако я бы хотел, чтобы у продукта было одно основное изображение.

Я знаю, что это очень легко сделать с помощью метода в модели, но я хочу, чтобы он был ассоциацией, чтобы я мог предварительно загрузить его в запрос с помощью 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 в таблицу продуктов, а затем добавить в модель Image:

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

Однако это не допускает какого-либо отката к другим изображениям has_many, если основное изображение равно nil - что я хотел бы, чтобы ассоциация загрузилась.

Именно поэтому я надеялся на что-то в модели изображений, например:

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

Но это дает мне ошибку ассоциации.

Можно ли как-нибудь отредактировать это has_one или мне действительно нужно запустить задачу rake, чтобы вставить изображение в каждое поле main_image_id, а затем добавить проверку для будущих продуктов, чтобы убедиться, что основное изображение было добавлено?

EDIT:

Должен ли я вместо этого использовать has_and_belongs_to_many связь?

1 Ответ

14 голосов
/ 23 марта 2012

Думаю, вы почти у цели, хотя мне не очень понятны полиморфные ассоциации.Я думаю, что вы хотите следующее:

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