Следует заметить, что на самом деле ничто не мешает вам сделать это:
class Media < ActiveRecord::Base
belongs_to :question
belongs_to :answer
end
Однако самый большой недостаток этого подхода заключается в том, что в вашей таблице мультимедиа у вас должно быть два столбца внешнего ключа, допускающих обнуляемость -question_id
и answer_id
.
И если вы хотите присоединить носитель к другому классу, вам придется добавить еще один столбец внешнего ключа, который может иметь значение NULL, в таблицу носителей.
Чтобы решить эту проблемупроблема, у Rails есть полиморфные ассоциации для вас - используя их, медиа могут принадлежать ко многим другим моделям, через одну ассоциацию.
Так что теперь вы можете моделировать свои ассоциации как в ответе @Sean Hill на ваш вопрос:
class Media < ActiveRecord::Base
belongs_to :mediable, :polymorphic => true
end
class Question < ActiveRecord::Base
has_many :media, :as => :mediable
end
# etc.
Ваша медиа-таблица будет представлять полиморфную ассоциацию только с одной парой столбцов: mediable_id
(некоторое целое число) и mediable_type
('Вопрос' или 'Ответ').
Не забывайте, что вам также необходимо добавить столбцы в соответствующую миграцию (миграция CreateMedia - при необходимости измените):
t.integer :mediable_id
t.string :mediable_type
Или, болеепросто с одним столбцом:
t.references :mediable, :polymorphic => true