2012-03-23 13 views
12

Ho un prodotto e un prodotto può avere molte immagini. Questo è attraverso una tabella di associazioni. Tuttavia, vorrei che un prodotto avesse un'immagine principale.hanno_una associazione has_many

So che questo è molto facile da fare con un metodo nel modello, ma voglio che sia un'associazione in modo che possa precaricarlo nella query usando include.

Modelli:

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 

Nella tabella ImageAssociation, c'è una colonna booleano chiamato 'caratteristica' che associa l'immagine come immagine 'principale'.

Uno dei modi che ho pensato di fare questo è l'aggiunta di una colonna main_image_id alla tabella prodotti, e quindi aggiungendo al modello Image:

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

Tuttavia, questo non consente alcun fallback all'altra ha_molte immagini se l'immagine principale è zero - che mi piacerebbe che l'associazione caricasse.

Quale è il motivo per cui speravo in qualcosa nel modello di immagini come:

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

Ma che mi dà un errore di associazione.

C'è un modo che posso modificare che has_one, o ho davvero bisogno di eseguire un'attività rake per spingere un'immagine in ogni campo main_image_id, e quindi aggiungere una convalida per i prodotti futuri per assicurarsi che sia stata aggiunta un'immagine principale ?

EDIT:

Dovrei usare un'associazione has_and_belongs_to_many invece?

risposta

13

Sei quasi lì, penso, anche se non sono così chiaro sulle associazioni polimorfiche. Penso che tu voglia quanto segue:

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

No. Puoi farlo con altre associazioni has_many filtrate per la raccolta se lo desideri, ma non specificare has_one. Questo errore si verifica: 'ActiveRecord :: HasOneThroughCantAssociateThroughCollection: non può avere un has_one: tramite l'associazione 'Article # image' dove l'associazione: through 'Article # image_associations' è una raccolta. Specificare un'associazione has_one o belongs_to nell'opzione: through invece. Aveva già provato. –

+0

Ah, potrei vedere. Fammi provare una modifica. – Chowlett

+1

Correzione alla prima riga- ': has_one: main_image_assoc,: class_name =>" ImageAssociation ",: order => 'feature = true',: as =>: imageable' ... questo consente il fallback (e la sintassi corretta) . Grazie! –

Problemi correlati