Rails: Ассоциации

программирование ruby ruby on rails rails

Всем привет.

Есть модели: user, post, revision.

В таблице revisions следующие поля: target_type, target_id, version, user_id.
То есть при выполнении
@revision = @post.revisions.build(:target_type => 'Post', :version => 'test', :user_id => current_user.id)
в target_type записывается тип цели ревизии - Post, в target_id должен записываться id поста, в version записываются значения полей поста в YAML-формате, и user_id - это id автора ревизии (то есть того, кто изменил пост).

Если я правильно понимаю, в моделях должно быть что-то вроде такого:

# user.rb
has_many :posts

# post.rb
belongs_to :user
has_many :revisions

# revision.rb
belongs_to :user
belongs_to :app

Но как мне указать, что нужно при выполнении build заносить в target_type - 'Post', в target_id - @post.id, в user_id - current_user.id? Запутался с ключами :through, :source, :polymorphic и т.д.

Пробовал в post.rb прописывать:
has_many :revisions, :as => :target, :dependent => :destroy

Но при создании ассоциации пишет "ActiveRecord::UnknownAttributeError: unknown attribute: target_id"

Помогите, пожалуйста, разобраться.

Примечание:
Антон Витальевич, благодарю за ответ! Сейчас разнес по разным таблицам (то есть post_revisions и т.д.), но в будущем планирую объединить в одну таблицу ревизий.
Ответы:
Зря вы на попятную пошли. Полиморфизм это круто, я даже представить себе не мог, что буду его настолько часто и успешно использовать в проектах.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.