多态有很多自我指涉

时间:2009-02-27 14:02:36

标签: ruby has-many polymorphism

我有很多模特(文章,视频,照片)

现在我正在尝试创建一个related_to关联,例如

文章可以包含许多与之相关的文章,视频和照片。视频和照片也是如此。

继承了我的尝试:

模块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

class RelatedItem<的ActiveRecord :: Base的   belongs_to:source,:polymorphic =>真正   belongs_to:related,:polymorphic =>真正 端

然后我在我的三个模型(文章,视频,照片)中添加了acts_as_relatable,并将模块包含在ActiveRecord :: Base中

在尝试./script/console时我得到它来添加相关项并且id正常工作但是source_type和related_type总是相同的(调用related_items的对象)我希望related_item是另一个型号名称。

任何想法?

1 个答案:

答案 0 :(得分:0)

我会使用has many polymorphs插件,因为它支持双面多态,你可以这样做:

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

并且不要忘记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

我不知道“关联”是一个好名字,但你明白了。现在,文章,视频和照片可能与另一篇文章,视频或照片有关。