Construire/Modifier une classe dymamiquement

Bonjour,

Je suis en train d’apprendre et d’évaluer Rails depuis quelques semaines
pour voir si je peux
développer une application assez complexe. J’ai le bouquin de Eyrolles
comme livre de chevet et
je suis déjà en train de tomber amoureux de ce framework (Mes collègues
se foutent de moi :slight_smile: )

Plus sérieusement, je voudrais faire un système qui permette de faire
des questionnaires qui changent
et évoluent tout le temps. Donc pas question de faire une table
“questions” avec chaque champs
qui correspond à une question.

Ce que j’essaye donc de faire c’est une table “surveys” qui contient la
liste des questionnaires,
une table “questions” qui contient les définitions des questions et une
table “responses” qui contient
les réponses en vrac avec un “user_id” pour savoir à qui appartient la
réponse et “question_id” pour
savoir à quelle question appartient cette réponse.

Jusque là tout va bien.

Mais là où Rails serait imbattable, c’est si je pouvais modifier
dynamiquement la classe “survey” en se
basant sur une sélection de “questions”. Par exemple si:

survey has_many :questions
survey has_many :responses

question belongs_to :survey
question has_many :responses

L’idéal serait alors modifier la classe “survey” avec les définitions
des questions pour pouvoir tirer toute la
puissance de ActiveRecord. Exemple, pour chaque question, la classe a
des “validates” spécifiques, un version
modifié dynamiquement du “_form.rhtml”, etc …

Ma question : existe-t-il une bonne façon d’aborder ce problème en
Rails, une convention, un tutorial ?
La question peut s’étendre à tous les cas d’objets à géométrie variable.

Suis-je clair ? Je sais pas mais poser la question m’éclaircit déjà un
peu plus.

Merci de votre avis

Christophe

Christophe Guégan :

Je suis en train d’apprendre et d’évaluer Rails depuis quelques
semaines pour voir si je peux développer une application assez
complexe. J’ai le bouquin de Eyrolles comme livre de chevet et
je suis déjà en train de tomber amoureux de ce framework (Mes
collègues se foutent de moi :slight_smile: )

On va mettre ça sous le compte de l’effet St-Valentin !
Attention de ne pas tomber amoureux du langage Ruby aussi !
(2e effet KISS Cool)

cette réponse.
Question :slight_smile: Une question peut-elle appartenir à plusieurs
questionnaires à la fois ?

question has_many :responses
Je ne suis pas sûr que tu aies besoin de “survey has_many :responses”.
Comme response belongs_to :question, tu sais à quelle “survey”
elle appartient en passant par question.

L’idéal serait alors modifier la classe “survey” avec les définitions
des questions pour pouvoir tirer toute la puissance de ActiveRecord.
Exemple, pour chaque question, la classe a des “validates”
spécifiques, un version modifié dynamiquement du “_form.rhtml”, etc …

Il faut voir aussi ce que tu entends par “modifié dynamiquement”.
Y-a-t-il un nombre limité de types de question ?
Par exemple en s’inspirant des formulaires en HTML, il peut
y avoir des questions nécessitant une réponse choisie dans une
liste, un champ (“Quelle est la couleur du cheval blanc d’Henri II ?”
-> “blanc”)(chaîne de caractère, entier, réel), un choix multiple
(équivalent du par opposition au
), un booléen, une date …
au final un nombre fin de type.

Ou alors des questions plus complexes, par exemple des
questions conditionnelles :
"- Avez-vous déjà mangé du poulet atteint de grippe aviaire ?

  • oui/non.
  • Si oui, il était bon ?
    • excellent ! il a encore plus de goût .
    • moyen, ça vaut pas un poulet qui a la maladie de la vache folle.
    • pas terrible, il était sensé être élevé en plein air et le
      confinement
      lui donne une chair déprimée."

Dans le premier cas, il te serait peut-être avantageux
de regarder du côté du STI (single table inheritance,
héritage simple dans le bouquin en français ?). Je ne vois
pas a priori de souci à définir des validations différentes
dans les classes filles comme BooleanQuestion
par rapport à la classe mère Question (ou AbstractQuestion).

Après les questions ne s’affichent qu’une par une ?
Soit dans ton controller, ton action appelle la vue qui va
bien, selon la classe de la question. Soit ta vue, selon
la classe de la question, affiche le bon
ou appelle le partiel qui va bien.

Dans le second cas, c’est plus compliqué et j’ai pas
réfléchi à ça (un survey avec une structure d’arbre ?)

Ma question : existe-t-il une bonne façon d’aborder ce problème
en Rails, une convention, un tutorial ?
La question peut s’étendre à tous les cas d’objets à géométrie
variable.

STI mais ça marche pas à tous les coups (lire le chapitre
qui en parle).

Suis-je clair ? Je sais pas mais poser la question m’éclaircit
déjà un peu plus.

en tout cas, ça m’a donné une idée de questionnaire.

-- Jean-François, "C'est bon un poulet qui a le chikugunya ?".