Полиморфный has_many самоссылки - PullRequest
1 голос
/ 27 февраля 2009

У меня есть ряд моделей (статья, видео, фото)

Теперь я пытаюсь создать ассоциацию 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 true принадлежат: родственные,: полиморфные => правда конец

Затем я добавил act_as_relatable к моим трем моделям (Статья, Видео, Фото) и включил модуль в ActiveRecord :: Base

При попытке в ./script/console я получаю добавление связанных элементов, и идентификаторы работают корректно, однако source_type и related_type всегда одинаковы (объект, из которого вызывается related_items). Я хочу, чтобы related_item был другим название модели.

Есть идеи у кого-нибудь?

1 Ответ

0 голосов
/ 01 марта 2009

Я бы использовал с множеством плагинов , так как он поддерживает двусторонний полиморфизм, вы можете сделать что-то вроде этого:

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

и не забывайте миграцию БД:

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

Я не знаю, является ли "Соотношение" хорошим названием, но вы поняли идею. Теперь статья, видео и фото могут быть связаны с другой статьей, видео или фотографией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...