У меня есть модель персонажа и модель связи. Модель Link представляет собой ссылку от персонажа к другому персонажу. Ссылка имеет текстовый атрибут «описание». Ссылка от символа A к символу B отличается от противоположной ссылки от B к A. Символ имеет ноль или одну ссылку на другой символ. Персонаж может иметь различные ссылки на разных персонажей. Персонаж может быть связан с различными персонажами.
Я использовал связи Active Record для частичной реализации отношений между символами и моделями ссылок:
class Character
has_many :links # the links from the character to other characters
class Link
belongs_to :character # the character from which starts the link to another character
, которые дают мне полезные методы, такие как character.links (массив всех ссылок, начинающихся с этого символа) или link.character (символ, с которого начинается ссылка)
Модель связи также имеет to_character_id
, который содержит идентификатор персонажа, который идет по ссылке. Таким образом, ссылка от символа A к символу B является экземпляром со следующими атрибутами:
character_id
= идентификатор символа A
to_character_id
= идентификатор символа B
description
= некоторый текст
Я написал несколько дополнительных методов, таких как character.links_to
(возвращает массив всех ссылок, указывающих на символ) или link.to_character
(возвращает символ, на который указывает ссылка), или character.characters_who_link_to
(возвращает массив других персонажей, имеющих ссылку на этого персонажа). Я также написал обратный вызов, чтобы убедиться, что при удалении символа удаляются все ссылки на этот символ (то же самое для восстановления).
Можно ли использовать дополнительные объявления отношений AR, которые бы предоставили мне такие дополнительные методы, чтобы мне не приходилось самим писать эти методы и обратные вызовы?
Agile Web Development с Rails представляет решение в разделе «Использование моделей в качестве таблиц объединения», но для таблицы объединения, объединяющей две разные таблицы.
В моем случае моя таблица соединений Ссылки объединяют записи одной таблицы, символов.