Relations multiples entres tables


#1

Bonjour à tous,

Je vais vous exposer un problème relativement complexe, je suis bloqué
et si quelqu’un pouvait me donner un coup de pouce je ne le remercierais
jamais assez !

Le concept :

J’ai une série de tables en DB (users, functions, expertizes, …)

Je souhaites mettre en place un système qui me permette de lier ces
différents objets entre eux de manière très flexible vie une seule
table, en “typant” les liaisons.

Mon idée :

Créer une table “objectrelations” qui contiendrait les champs suivants :

id
linkfrom_id
linkfrom_type
linkto_id
linkto_type
created_at
updated_at
stopped_at

#1 record de objectrelations :
id : 1
linkfrom_id : 1 # User ID = 1
linkfrom_type : “User”
linkto_id : 1 # Expertize ID = 1
linkto_type : “Expertize”
created_at : now()
updated_at : now()
stopped_at : NULL

Le problème :

Tout ceci fonctionne bien en DB, ça me permet de créer des liens entre
les différents objets, de remonter divers liens, de mettre fin à un lien
(via la colonne stopped_at) sans supprimer le lien en DB (on garde un
historique) …

Par contre, je ne vois vraiment pas comment modéliser tout ceci dans
Rails (dans les modèles).

Je penses avoir bien compris que je devrai utiliser le polymorphisme,
les “Through Associations” ou encore “L’héritage de table” mais je n’y
arrive pas.

J’ai regardé du côté de “acts_as_taggable”, ils utilisent un système
semblable mais uniquement dans un sens (n’importe quel objet -> des
tags). Malheureusement, ici je dois pouvoir lier n’importe quoi avec
n’importe quoi …

Est-ce que quelqu’un a une idée pour m’aider ? Comment dois-je m’y
prendre ?

Merci.


#2

Vincenzo Ruggiero wrote:

Je souhaites mettre en place un système qui me permette de lier ces
linkto_id
linkto_type : “Expertize”

n’importe quoi …

Est-ce que quelqu’un a une idée pour m’aider ? Comment dois-je m’y
prendre ?

Merci.

Faire une sorte de méta-programmation. Dans le sens où il faut peut-être
pas utiliser le polymorphisme de rails qui est pour un seul élément.
Mais en générer un pour 2.

ex :

def to
Eval("#{linkto_type.camelize}.find(#{linkto_id})")
end

def from
Eval("#{linkfrom_type.camelize}.find(#{linkfrom_id})")
end

Après ce qui est TRES complique est peut-être la mauvaise méthode :slight_smile:


Cyril M.
http://blog.shingara.fr


#3

Michael H. wrote:

Problème très intéressant! Peut-être peux-tu aller voir par ici:
http://wiki.rubyonrails.org/rails/pages/ManytoManyPolymorphicAssociations

Ahhhh, ça semble en effet répondre à ma question.

Ils ont d’ailleurs utilisé +/- les mêmes conventions de nommage que moi,
je vais partir vers ça.

Merci beaucoup !


#4

Problème très intéressant! Peut-être peux-tu aller voir par ici:
http://wiki.rubyonrails.org/rails/pages/ManytoManyPolymorphicAssociations