2009-02-27 12 views
1

J'ai un certain nombre de modèles (article, vidéo, photo)has_many polymorphes autoréférentielle

Maintenant, je suis en train de créer une association de RELATED_TO, de telle sorte que

Un article peut avoir beaucoup d'autres articles, vidéos et des photos liées à celui-ci. Comme peuvent les vidéos et les photos.

Heres ce que j'ai essayé:

Module

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 

fin

classe RelatedItem < ActiveRecord :: Base belongs_to: source: polymorphes => true belongs_to: lié, : polymorphique => vrai fin

Puis j'ai ajouté acts_as_relatable à mes trois modèles (Article, Vidéo, Photo) et inclus le module dans ActiveRecord :: Base

En essayant dans ./script/console je l'obtiens pour ajouter les articles liés et les ids fonctionnent correctement Cependant, le type_source et le type_transfert sont toujours les mêmes (l'objet auquel les éléments liés ont été appelés). Je veux que l'élément lié soit l'autre nom de modèle.

Vous avez des idées?

+0

Je comprends ce que vous essayez de faire avec related_items - vous l'avez expliqué au-dessus du code - mais à quoi servent les sources_items? –

+0

Ce serait génial si vous pouviez corriger l'indentation afin que le bloc de code contienne tout votre code. – Benson

Répondre

0

Je voudrais utiliser le plug-in has many polymorphs car il prend en charge le polymorphisme double face, vous pouvez faire quelque chose comme ceci:

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 

et ne pas oublier la migration db:

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 

Je ne savoir si "Relating" est un bon nom, mais vous avez l'idée. Maintenant, un article, une vidéo et une photo peuvent être liés à un autre article, une vidéo ou une photo.