Двойные полиморфные ассоциации - PullRequest
1 голос
/ 03 апреля 2012

У меня двойные полиморфные ассоциации, в основном я собираюсь связать модель вопросов и модель VideoInterview с моделью Бонда. Они сделаны следующим образом:

миграция облигаций

class CreateBonds < ActiveRecord::Migration
  def change
    create_table :bonds do |t|
      t.references :sourceable, :polymorphic => true
      t.references :targetable, :polymorphic => true
      t.string :operation
      t.string :score
      t.timestamps
    end
  end
end

bond.rb

class Bond < ActiveRecord::Base
  belongs_to :sourceable, :polymorphic => true
  belongs_to :targetable, :polymorphic => true
end

question.rb

class Question < ActiveRecord::Base
  has_many :bonds, :as => :sourceable
  has_many :bonds, :as => :targetable
end

video_interview.rb

class VideoInterview < ActiveRecord::Base
  has_many :bonds, :as => :sourceable
  has_many :bonds, :as => :targetable
end

Как мне изменить модель в заказах, чтобы правильно использовать эту связь? Если я назову @ question.bonds, я думаю, что что-то не так, потому что sourceable и targettable определены в одном и том же has_many: bond. Я бы хотел сделать @ question.sources и получить все связи с вопросом в качестве источника. Спасибо

1 Ответ

1 голос
/ 03 апреля 2012

вам нужно иметь разные названия для ваших ассоциаций, при этом наименование обеих облигаций ассоциаций в случае, если они являются исходными и адресными, не подойдет для вас. Вы можете назвать это как угодно и указать имя класса для связи с моделью связи, подобной этой, для модели Вопроса

class Question < ActiveRecord::Base
  has_many :sources, :class_name => 'Bond', :as => :sourceable
  has_many :targets, :class_name => 'Bond', :as => :targetable
end

и аналогично для модели VideoInterview

class VideoInterview < ActiveRecord::Base
  has_many :sources, :class_name => 'Bond', :as => :sourceable
  has_many :targets, :class_name => 'Bond', :as => :targetable
end

теперь вы можете вызывать такие функции, как @ question.sources, @ question.targets, @ video_interview.sources, @ video_interview.targets

надеюсь, что это поможет.

...