IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Pb avec l'utilisation d'une table de jointure


Sujet :

Ruby on Rails

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut Pb avec l'utilisation d'une table de jointure
    Bonjour!

    J'ai 2 tables (Groupes et Personnes) pour lesquels j'ai bien mis le "has_and_belongs_to_many" dans les modèles:

    Groupes:
    ID
    IDCréateur
    Champ1
    Champ2

    Personnes:
    ID
    Nom
    Prénom

    Et une table de jointure fait la liaison entre les 2:
    groupes_personnes:
    ID_gp
    groupe_id
    personne_id

    pers_status

    où groupe_id et personne_id sont des clés étrangères en référence aux 2 tables précédente et pers_status indique le "statut" de la personne dans le groupe (soit "chef", soit "délégué" soit "membre")

    J'aimerais pouvoir récupérer pour une personne donnée l'ensemble des groupes pour lesquels elle est "chef"... J'ai écrit cela mais ça ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pers = Personne.find(id_de_la_personne_que_je_veux)
    @groupesChef = pers.groupes(:pers_status => "chef")
    Avec ensuite un système d'affichage de la table obtenue dans une de mes vues. Je n'ai pas d'erreur mais me donne tous les groupes où se trouve ma personne sans faire de distinction par rapport au "statut"...

    Quelqu'un a une idée?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Bonjour!

    Merci pour ton aide! J'ai essayé plusieurs trucs comme ça et j'ai cette erreur:
    undefined method `groupes_by_pers_status' for #<Pers:0x47ceecc>

    Est-ce que tu as une idée de où ça peut venir?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Bonjour!

    Merci pour ton aide! J'ai essayé plusieurs trucs comme ça et j'ai cette erreur:
    undefined method `groupes_by_pers_status' for #<Pers:0x47ceecc>

    Est-ce que tu as une idée de où ça peut venir?

  4. #4
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut
    Voila; essaye avec ça j'espère que ça va t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pers = Personne.find(id_de_la_personne_que_je_veux)
    @groupesChef = pers.groupes_personnes.find_by_pers_status("chef").groupes
    (j'ai essayé avec une table de jointure pour has_many :through mais je ne sais pas si ça marche pour has_many_and_belongs_to)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Bon... je comprends pas trop ce que j'ai fait, ton 1er message a disparu et à la place y'a 2 fois le mien... bref...

    Alors je suis allée dans mes models groupe.rb et personne.rb et j'ai ajouté au "has_and_belongs_to_many" le ":through => :groupes_personnes" mais ça n'a pas l'air de lui plaire, j'ai le message d'erreur suivant: Unknown key(s): through...

  6. #6
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par cissou06 Voir le message
    Bon... je comprends pas trop ce que j'ai fait, ton 1er message a disparu et à la place y'a 2 fois le mien... bref...
    C de ma faute, g effacé mon message pke d'une part g mal compri la question et d'autre part il manque le find à la syntaxe que j t'ai donné (groupes_find_by et non pas groupes_by...)
    Citation Envoyé par cissou06 Voir le message
    Alors je suis allée dans mes models groupe.rb et personne.rb et j'ai ajouté au "has_and_belongs_to_many" le ":through => :groupes_personnes" mais ça n'a pas l'air de lui plaire, j'ai le message d'erreur suivant: Unknown key(s): through...
    je ne sais pas si c permis en Rails la relation has_and_belogs_to_many .... through
    mais la syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    has_and_belongs_to_many :personnes, :through => :groupes_personnes
    Voila...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    D'après Titoumimi :
    à partir du moment où tu stoques des informations supplémentaires dans ta table d'association, il faut que tu passe pas has_many :through, et que tu créer un vrai modèle pour ta table d'association
    dans un autre post où j'ai posé une question un peu similaire...

    Je vais essayer, on va voir... Merci en tout cas!!!!

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    T'es pas obligé...les habtm peuvent porter des données sur la table d'association...
    Mais franchement, si t'es débutant, il vaut mieux que tu ne batailles pas trop avec les habtm, mais plutot que tu généres un modele simple sur la table d'association.
    Ensuite tu fais des associations simples has_many et belongs_to.
    Ca sera beaucoup plus simple à gérer ensuite.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    Citation Envoyé par abir84
    je ne sais pas si c permis en Rails la relation has_and_belogs_to_many .... through
    mais la syntaxe est :
    Code :
    has_and_belongs_to_many :personnes, :through => :groupes_personnes
    Non !!!
    Je sais pas où tu as vu ça mais has_and_belongs_to_many :through n'a jamais existé.


    Citation Envoyé par Zfred
    T'es pas obligé...les habtm peuvent porter des données sur la table d'association...
    J'ai du mal à trouver des infos là dessus (has_and_belongs_to_many avec des données dans la table d'association).
    J'ai quand même vu ça dans la doc :
    Deprecated: Any additional fields added to the join table will be placed as attributes when pulling records out through has_and_belongs_to_many associations. Records returned from join tables with additional attributes will be marked as ReadOnly (because we can‘t save changes to the additional attributes). It‘s strongly recommended that you upgrade any associations with attributes to a real join model (see introduction).
    Si je comprends bien donc, habtm est maintenant reservé pour des associations sans attributs, et il est fortement conseillé d'utiliser has_many avec l'option :through pour tout ce qui est plus complexe.

    Je seconde donc ce que tu disais Zfred :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Groupe < AR::Base
      has_many :adhesions
      has_many :personnes, :through => :adhesions
    end
     
    class Personne < AR::Base
      has_many :adhesions
      has_many :groupes, :through => :adhesions
    end
     
    class Adhesion
      belongs_to :groupe
      belongs_to :personne
      # attribut : role
    end
    Recuperer les chefs d'un groupe devrait être possible avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Groupe < AR::Base
      has_many :adhesions_chefs, :class_name => 'Adhesion', :conditions => "role = 'chef'"
      has_many :chefs, :through => :adhesions_chefs, :class_name => 'Personne'
    end
    J'ai pas testé (il faudrait créer les tables, etc.) mais de mémoire, il me semble que ça devrait fonctionner.
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Désolé mais je suis pas doué... Je n'arrive pas à utiliser ces relations dans mon controller... J'ai gardé le nom composé de ma table de jointure groupes_personnes (au lieu de adhesions)... peut-être que l'erreur vient de là en fait...

    J'ai donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Groupe < AR::Base
      has_many :groupes_personnes_chefs, :class_name => 'Adhesion', :conditions => "role = 'chef'"
      has_many :chefs, :through => :groupes_personnes_chefs, :class_name => 'Personne'
    end
    Dans mon controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pers = Personne.find(id_de_la_personne_que_je_veux)
    @groupesChef = pers.groupes.groupes_personnes_chefs
    J'ai le message d'erreur suivant:
    undefined method `groupes_personnes_chefs' for Groupe:Class

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Premièrement, pers.groupes ne devrait pas être un tableau ?

    Deuxièmement, vérifies la cohérence des tables avec tes déclarations et utilises script/console ainsi que development.log pour chercher les erreurs éventuelles que tu as pu commettre.


    La raison pour laquelle j'ai mis Adhesions dans l'exemple et que ça me semble plus correct comme nom pour le modèle que GroupePersonne. Evidemment tu n'es pas obligé d'utiliser ça. Cependant il faut quand même que le nom de ton modèle corresponde au nom de ta table, ou utiliser set_table_name pour changer le nom défini par convention. De même pour les éventuels :class_name => '...', il faut qu'ils correspondent aux noms que tu as choisi.

    N'hésite pas à te plonger dans la documentation pour connaitre la signification de chaque option : http://api.rubyonrails.org/classes/A...ssMethods.html
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    J'ai gardé le nom composé de ma table de jointure groupes_personnes (au lieu de adhesions)
    T'as bien raison d'aprés moi. Chaque fois qu'on sort des conventions, on perd un bout de magie Rails, et puis ça marche plus, et puis on comprend pas pourquoi...!
    J'ai du mal à trouver des infos là dessus (has_and_belongs_to_many avec des données dans la table d'association).
    J'ai quand même vu ça dans la doc :
    Citation:
    Deprecated: Any additional fields added to the join table will be placed as attributes when pulling records out through has_and_belongs_to_many associations. Records returned from join tables with additional attributes will be marked as ReadOnly (because we can‘t save changes to the additional attributes). It‘s strongly recommended that you upgrade any associations with attributes to a real join model (see introduction).
    Si je comprends bien donc, habtm est maintenant reservé pour des associations sans attributs, et il est fortement conseillé d'utiliser has_many avec l'option :through pour tout ce qui est plus complexe.
    Beh voila tout est dit : C'est possible mais ce n'est pas franchement conseillé !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Premièrement, pers.groupes ne devrait pas être un tableau ?
    Oui effectivement... mais j'ai fini par essayer tout et n'importe quoi parce que je ne trouve pas la solution pour récupérer ce que je veux... et je n'y arrive toujours pas...

    Merci quand même.

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    P381 du livre "Ruby on Rails 2e edition"

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    C'est con j'ai pas la bonne édition...

  16. #16
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    P257 du livre "Ruby on Rails 1e edition"

    "Je l'aurai, un jour je l'aurai"....

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Il s'agit bien du bouquin "Pratique de Ruby on Rails" chez o'reilly avec un cerf sur la couverture? Parcqu'à la page 257 je n'ai pas plus d'information sur les tables de jointure, les has_many through etc...

  18. #18
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    Non je parlais du livre "Ruby on Rails" de chez Eyrolles, par Dave Thomas et David Heinemeir Hansson. Traduit par nos chers compatriotes Laurent Julliard, Jean-Michel Benech et Richard Piacentini.

    Le livre dont tu parles est trés bien aussi, mais il ne semble pas aborder le sujet qui nous interesse ici.

  19. #19
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut
    Tu peux télécharger ici le chapitre 18 du livre "Ruby on Rails 2e edition" qui contient la page 381 de la 2eme édition !!

    http://www.editions-eyrolles.com/Liv...24a17ddb37f7bf

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Utilisation d'une procédure avec ses paramètres contenu une table
    Par bisou007 dans le forum Développement
    Réponses: 0
    Dernier message: 01/07/2013, 17h07
  2. Réponses: 11
    Dernier message: 09/06/2010, 15h32
  3. [MySQL] Re-utilisation d'une table avec des alias
    Par slake13 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/10/2008, 17h56
  4. Réponses: 2
    Dernier message: 19/06/2008, 16h46
  5. [BO 6.5] Utilisation d'une table sans jointure ?
    Par NKC78 dans le forum Deski
    Réponses: 7
    Dernier message: 22/11/2007, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo