2009-02-27 11 views
1

Ich habe eine Reihe von Modellen (Artikel, Video, Foto)Polymorphe has_many selbstbezüglicher

Nun Ich versuche, eine RELATED_TO Assoziation zu schaffen, so dass

Ein Artikel viele andere Artikel haben, Videos und Fotos dazu. Wie können Videos und Fotos.

Heres, was ich habe versucht:

Modul ActsAsRelatable

def self.included(base) 
    base.extend(ClassMethods) 
end 

module ClassMethods 
    def acts_as_relatable 
     has_many :related_items, :as => :related 
     has_many :source_items, :as => :source, :class_name => 'RelatedItem' 
    end 
end 

Ende

Klasse RelatedItem < Activerecord :: Base belongs_to: Quelle: polymorphen => true belongs_to: bezogen, : polymorph => wahr Ende

Dann habe ich hinzugefügt acts_as_relatable meine drei Modelle (Artikel, Video, Foto) und enthalten das Modul in Activerecord :: Base

Wenn in ./script/console versuche ich es die damit verbundenen Elemente hinzuzufügen und die IDs richtig funktionieren Allerdings sind der source_type und der related_type immer gleich (das Objekt, von dem related_items aufgerufen wurde). Ich möchte, dass das related_item der andere Modellname ist.

Irgendwelche Ideen jemand?

+0

Ich bekomme, was Sie mit related_items zu tun versuchen - Sie haben das über den Code erklärt - aber wofür ist source_items? –

+0

Es wäre großartig, wenn Sie die Einrückung korrigieren könnten, so dass der Code-Block Ihren gesamten Code enthält. – Benson

Antwort

0

würde ich das has many polymorphs Plugin verwenden, da es doppelseitige Polymorphie unterstützt Sie so etwas tun kann:

class Relating < ActiveRecord::Base 
    belongs_to :owner, :polymorphic => true 
    belongs_to :relative, :polymorphic => true 

    acts_as_double_polymorphic_join(
     :owners => [:articles, :videos, :photos], 
     :relatives => [:articles, :videos, :photos] 
    ) 
end 

und vergessen Sie nicht die db Migration:

class CreateRelatings < ActiveRecord::Migration 
    def self.up 
    create_table :relating do |t| 
     t.references :owner, :polymorphic => true 
     t.references :relative, :polymorphic => true 
    end 
    end 

    def self.down 
    drop_table :relatings 
    end 
end 

ich nicht tun wissen, ob "Relating" ein guter Name ist, aber Sie bekommen die Idee. Jetzt können ein Artikel, ein Video und ein Foto mit einem anderen Artikel, Video oder Foto in Verbindung gebracht werden.