J'ai un modèle de caractère et un modèle de lien. Le modèle Link représente un lien d'un caractère à un autre caractère. Un lien a un attribut 'description' textuel. Un lien du caractère A au caractère B est distinct du lien opposé de B à A. Un caractère a zéro ou un lien vers un autre caractère. Un personnage peut avoir différents liens vers différents personnages. Un personnage peut être lié à différents personnages.Relations ActiveRecord pour une table de jointure reliant deux enregistrements de la même table?
J'ai utilisé utilisé des relations Active Record à mettre en œuvre en partie les relations entre les modèles de personnages et Lien:
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
qui me donnent des méthodes utiles comme character.links (tableau de tous les liens à partir de ce caractère) ou link.character (caractère à partir duquel commence le lien)
Le modèle de lien a également un to_character_id
qui contient l'ID du caractère à qui va le lien. Ainsi, un lien de caractère A à caractère B est une instance avec les attributs suivants:
character_id
= id de caractère Ato_character_id
= id de caractère Bdescription
= texte
J'ai écrit diverses méthodes supplémentaires comme character.links_to
(renvoyant un tableau de tous les liens pointant vers le caractère) ou link.to_character
(retournant le caractère vers lequel pointe le lien), ou character.characters_who_link_to
(retourner un tableau des autres caractères ayant un lien vers ce personnage). J'ai aussi écrit un rappel pour m'assurer que lorsqu'un caractère est supprimé, tous les liens qui vont à ce caractère sont supprimés (même chose pour la restauration).
Est-il possible d'utiliser des déclarations de relations AR supplémentaires qui me fourniraient ce type de méthodes supplémentaires, de sorte que je n'ai pas besoin d'écrire moi-même ces méthodes et rappels?
Le développement Web Agile avec Rails présente une solution dans la section "Utilisation de modèles comme tables de jointure" mais pour une table de jointure reliant deux tables différentes. Dans mon cas, ma table de jointure rejoint les enregistrements d'une seule table, Caractères.
Donc, fondamentalement, vous voulez que les caractères aient une relation has_and_belongs_to_many: characters? – ErsatzRyan