Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ruby > Ruby on Rails
Ruby on Rails Le forum sur le framework Ruby on Rails. Voir aussi la FAQ RoR et les cours RoR.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2011, 10h45   #1
Membre confirmé
 
Homme
Inscription : février 2005
Messages : 287
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 287
Points : 271
Points : 271
Par défaut Créer une instance de modèle avec 2 clefs étrangères

Bonjour à tous,

Après avoir pas mal touché de PHP, .net, etc. je débute depuis quelques semaines en Rails. J'ai lu pas mal de choses, fait de petits tests, et me suis lancé sur la rédaction d'une première appli de gestion de tâches (original ).

Dans cette appli, j'ai les modèles suivants :
Code :
1
2
3
User (mail:string, password:string)
Notebook (name:string, public:boolean, #user_id:integer)
Task (name:string, done:boolean, #notebook_id:integer, #user_id:integer)
  • Un user "has_many :notebooks", et "has_many :tasks"
  • Une tâche "belongs_to notebook", mais "belongs_to user" également

Le cas des notebooks faisant référence à un unique "parent" était réglé d'un simple :
Code :
@user.notebooks.new(....)
Mais j'ai bloqué hier pour la création des tâches qui font référence à 2 modèles "parents" différents, User et Notebook. Et là, je sèche. J'ai vu les associations polymorphiques, mais il me semble que cela concerne les cas où une instance d'un modèle peut avoir 2 parents différents, mais pas au même moment (soit l'un, soit l'autre). Je creuserai quand même cette piste.


Le problème est sans doute courant et simple pour des personnes plus aguerries que moi en Rails, c'est pour ça que je sollicite votre aide ! D'avance merci à ceux qui seront arrivés jusque là et pourront peut-être me fournir des pistes
PierreAd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 14h26   #2
Membre confirmé
 
Homme
Inscription : février 2005
Messages : 287
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 287
Points : 271
Points : 271
Bon, je m'auto-réponds.
Pour l'instant j'ai résolu le problème en utilisant le code suivant :
Code :
1
2
3
4
5
6
@task = Task.new(params[:task])
@task.user = current_user
@task.carnet = Carnet.find(params[:task][:carnet_id])
 
if @task.save
  ....
Par contre, aucune assurance sur la qualité de ce code (notamment la "double" récupération du paramètre carnet_id. N'hésitez pas à me dire ce que vous pensez de cette façon de faire (notamment, et surtout si elle n'est pas "bonne").

Merci
PierreAd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 16h24   #3
Candidat au titre de Membre du Club
 
Homme
Inscription : novembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 8
Points : 11
Points : 11
Dans ton cas simple :
- Oublie la polymorphique.
- Enleve la relation entre Task et User

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
User
has_many :notebooks
 
Notebook
has_many :tasks
belongs_to :user
 
Task
belongs_to :notebook
 
def create
@notebook = Notebook.find(...)
@task = @notebook.tasks.new(params[:task])
if @task.save
...
end
Méfie toi du terme "task" qui est peut être déjà un mot réservé
Ipoténuz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 19h45   #4
Membre confirmé
 
Homme
Inscription : février 2005
Messages : 287
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 287
Points : 271
Points : 271
Merci de ta réponse Ipoténuz ! Bien vu pour "task", j'avoue ne pas y avoir pensé ! En revanche, je te confirme que j'ai bel et bien "besoin" de la relation entre user et tasks, puisque j'ai donné la possibilité de créer des notebooks publics dans lesquels tous les utilisateurs peuvent ajouter des tâches.

Merci d'avoir pris un peu de temps pour réfléchir à ma question néanmoins
PierreAd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 14h41   #5
Candidat au titre de Membre du Club
 
Homme
Inscription : novembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 8
Points : 11
Points : 11
Rien ne t'empêche d'avoir plusieurs clefs. Par contre il faut gérer la cohérence.
(Ne pas avoir une tache belongs_to un utilisateur qui ne serait pas le même dans le notebook qui contient la tache en question...)
Réaliser un gestionnaire de tâches est un super exercice, il y a plein de manières pour l'entreprendre. Il y a une vraie nécessité de définir exactement le cahier des charges dès le départ.
Il y a des petites choses pas très claires :
- As tu envisagé d'assigner une tâche à plusieurs users ?
- Si tu utilises le current_user, ça veut donc dire que tu ne peut pas assigner une tâche à quelqu'un d'autre que soi-même ?
- Une tâche ne doit elle pas être apparaitre dans plusieurs Notebook ?
Ce n'est pas réalisable avec seulement 3 tables.
Ipoténuz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h55   #6
Membre confirmé
 
Homme
Inscription : février 2005
Messages : 287
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 287
Points : 271
Points : 271
Citation:
Envoyé par Ipoténuz Voir le message
Rien ne t'empêche d'avoir plusieurs clefs. Par contre il faut gérer la cohérence. (Ne pas avoir une tache belongs_to un utilisateur qui ne serait pas le même dans le notebook qui contient la tache en question...)
En effet.

Citation:
Envoyé par Ipoténuz Voir le message
Il y a des petites choses pas très claires :
- As tu envisagé d'assigner une tâche à plusieurs users ?
- Si tu utilises le current_user, ça veut donc dire que tu ne peut pas assigner une tâche à quelqu'un d'autre que soi-même ?
- Une tâche ne doit elle pas être apparaitre dans plusieurs Notebook ?
Ce n'est pas réalisable avec seulement 3 tables.
  • Une tâche = un utilisateur
  • En effet, la seule possibilité donnée est de créer ses propres tâches. Pas d'assignation de tâches aux autres utilisateurs donc.
  • Une tâche apparaît dans un seul notebook

Pour être tout à fait clair, l'objectif n'était pas de coder un gestionnaire de tâches hyper complet, mais plutôt de faire quelque chose de simple, fonctionnel, qui tienne la route, et qui permette à mon collègue et moi de progresser sur Rails en étant confrontés à des problèmes réels. Et puis c'est l'occasion de tester l'utilisation de jQuery, de Sass, de différentes gemmes... donc un bon moyen de se faire la main

Merci pour ton aide en tout cas, et je marque ce sujet comme résolu
PierreAd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 16h42   #7
Candidat au titre de Membre du Club
 
Homme
Inscription : novembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 8
Points : 11
Points : 11
Le problème c'est la notion de notebook public.
Car dans ce cas, le notebook n'appartient à personne, et on se sait pas quoi lui mettre en user_id.
Citation:
  • Une tâche = un utilisateur
  • Une tâche apparaît dans un seul notebook
Code :
1
2
3
4
5
6
7
8
9
Notebook
has_many :taches
 
User
has_many :taches
 
Tache
belongs_to :user
belongs_to :notebook
Pas besoin de plus que ça.
Tu passes par les taches pour récupérer les notebooks.
Si vraiment besoin, tu peux créer un champ owner_id qui contient l'id du user à qui appartient le notebook, et si c'est "null" alors il est public., ce qui te permettra dans la vue d'afficher les notebooks concernés.
Le schéma restera cohérent dans tous les cas.
Ipoténuz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h37.


 
 
 
 
Partenaires

Hébergement Web