2012-03-28 12 views
1

Nehmen wir an, ich habe ein Company Modell und ein Product Modell, die beide eine UserUploadedImage mit ihnen verbunden sind. Ich möchte meine UserUploadedImage in einer Weise erstellen, dass ich image.parent schreiben kann und dass entweder die Product oder die Company referenziert, was auch immer in diesem Fall geeignet ist.Konfigurieren Sie mein Modell, so dass ein Feld viele verschiedene Arten von Klassen verweisen kann

Ich weiß, ich kann eine zweite Spalte in UserUploadedImage mit entweder Product oder Company speichern und eine Bedingung haben, um den entsprechenden Wert nachzuschlagen. Ich bin mir jedoch nicht sicher, wo der optimale Ort für diesen Code ist oder ob es einen saubereren Weg gibt, mein Ziel zu erreichen. Vielen Dank!

Antwort

3

Was brauchen Sie zu betrachten ist Polymorphe Verbände

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

Polymorphe Verbände

Eine etwas fortgeschrittenere Variante Verbänden der polymorphe Vereinigung ist. Bei polymorphen Assoziationen kann ein Modell zu mehr als einem anderen Modell in einer einzigen Assoziation gehören. Sie können beispielsweise ein Bildmodell haben, das entweder einem Mitarbeitermodell oder einem Produktmodell angehört.

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

class Employee < ActiveRecord::Base 
    has_many :pictures, :as => :imageable 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, :as => :imageable 
end 

Sie eine polymorphe belongs_to Erklärung denken können eine Schnittstelle als Einrichtung, die jedes anderes Modell verwenden kann. Von einer Instanz des Employee-Modells können Sie eine Sammlung von Bildern abrufen: @ employee.pictures.

In ähnlicher Weise können Sie @ product.pictures abrufen.

Wenn Sie eine Instanz des Bildmodells haben, können Sie seine Eltern über @ picture.imageable zu bekommen. Um diese Arbeit zu machen, müssen Sie sowohl eine Fremdschlüsselspalte und eine Art Spalte im Modell erklären, dass die polymorphe Schnittstelle deklariert:

class CreatePictures < ActiveRecord::Migration 
    def change 
    create_table :pictures do |t| 
     t.string :name 
     t.integer :imageable_id 
     t.string :imageable_type 
     t.timestamps 
    end 
    end 
end 

Diese Migration kann unter Verwendung der t.references Form vereinfacht werden:

class CreatePictures < ActiveRecord::Migration 
    def change 
    create_table :pictures do |t| 
     t.string :name 
     t.references :imageable, :polymorphic => true 
     t.timestamps 
    end 
    end 
end 
Verwandte Themen