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 :

Relations N-N en mieux


Sujet :

Ruby on Rails

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut Relations N-N en mieux
    Bonsoir/Bonjour, c'est encore moi...

    Toujours dans le même projet de Bibliotheque de Manga j'ai besoin de faire une relation N-N mais en mieux. Je m'explique, j'ai une bdd avec des mangas et des utilisateurs, j'ai réussi à utiliser une relation N-N (avec des habtm des deux cotés) qui utilise une 3eme table afin de faire la collection de mangas de chaque utilisateur.

    Voila, je voudrais rajouter un status à chaque unité de la collection. Voici mes modèles

    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
    16
    17
     
    class Manga < ActiveRecord::Base
    	belongs_to :serie
    	#has_one :status, :through => :status
    	has_and_belongs_to_many :users
    end
     
    class Status < ActiveRecord::Base
    	belongs_to :manga
            #belongs_to :manga ,:through=> :status
    end
     
    class User < ActiveRecord::Base
     
      has_and_belongs_to_many :mangas
     
    end
    Pour le moment tout ce que je peut faire c'est par exemple current_user.mangas.find(une id).status_id mais je voudrais pouvori faire un status.description. Comme vous avez pu le voir j'ai essayer avec des :through mais j'avoue que je n'y comprend pas grand chose.

    Evidamment je pourrais faire un status = Status.find(current_user.mangas.find(uneid).status_id)) pour ensuite afficher les informations de mon status mais j'avoue que ce n'est pas trop génial comme solutions.

    remarque: j'ai une erreur du type avec mes :through

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Unknown key(s): through
     
    RAILS_ROOT: ./script/../config/..
    Application Trace | Framework Trace | Full Trace
     
    /home/fabseven/rails/projetbmanga/vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb:48:in `assert_valid_keys'
    /home/fabseven/rails/projetbmanga/vendor/rails/activerecord/lib/active_record/associations.rb:1123:in `create_has_one_reflection'
    /home/fabseven/rails/projetbmanga/vendor/rails/activerecord/lib/active_record/associations.rb:625:in `has_one'
    /home/fabseven/rails/projetbmanga/app/models/manga.rb:3
    /home/fabseven/rails/projetbmanga/app/controllers/macollection_controller.rb:44:in `ajouter'
    Voila, je remercie d'avance les gens qui liront ce poste.

    Remarque : j'ai chercher sur le net des exemples de ce cas mais je n'ai malheureusement pas trouver mon bonheur. Dans le book de rails que j'ai au boulot il me semble qu'on utilise un push with attributes (de façon bizarre) et il me semble que cette méthode est deprecated.

    Pour ceux que ca intèresse voici un lien pour quelques screens de ce que j'ai déjà fait : Images Projet BibliotekManga Gamma

  2. #2
    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
    Si j'ai bien compri ton probleme, je pense qu'il faut que tu fasse une relation NxN avec une table de jointure dans laquelle tu peux rajouter des informations, comme ton status.
    Dans ce cas il ne faut pas utiliser habtm, mais has_many avec :through


    class Manga < ActiveRecord::Base
    has_many :manga_users
    has_many :users, :through => :manga_users
    end

    class User < ActiveRecord::Base
    has_many :manga_users
    has_many :mangas, :through => :manga_users
    end

    class MangaUser < ActiveRecord::Base
    belongs_to :manga
    belongs_to :user
    end
    et dans ta table MangaUser tu peux ajouter les informations dont tu as besoin pour ta relation, comme ton status.

    Si c'est pas ça dont tu as besoin re-explique... j'ai peut-etre pas bien compris!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Hum, j'ai tester ta réponse en recopiant tes modèles et j'ai modifier le modèle MangaUser de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class MangaUser < ActiveRecord::Base
    	belongs_to :manga
    	belongs_to :user
    	has_one :status
    end
    J'ai du renommer ma table mangas_users que j'utilisais pour mon ancienne relation N-N en manga_users. J'ai également un model Status suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    class Status < ActiveRecord::Base
    	has_many :manga_users 
    end
     
    La table statuses est de la forme (id,status,description) exemple (0,"DLB","DANS LA BIBILOTEK")
    Ce que je constate à présent : par rapport à la relation précèdente l'ajout marche toujours, je n'arrive cependant plus à supprimer un enregistrement de la table manga_users comme avant avec la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def retirer
    		 m = Manga.find(params[:id])
    		 current_user.remove_mangas(m)
    		 current_user.save
    		 flash[:message] = " #{m.titre} retiré"
    		 redirect_to :action=>"macollection"
    end

    j'ai plutot le droit à une jolie erreur du type :
    Mysql::Error: #42S22Unknown column 'id' in 'where clause': UPDATE manga_users SET user_id = NULL WHERE (user_id = 1 AND id IN (NULL,NULL))
    -------

    Ce que je voudrais vraiment c'est que une fois que j'ai ma liste de mangas de l'utilisateur courant, càd current_user.mangas je puisse par exemple faire

    - current_user.mangas.find(params[:id]).status.description
    - current_user.mangas.find(params[:id]).status.id = params[:status]

    Tout simplement pour afficher les états des tomes de ma bibliothèques...comme "DANS MA BIBLIO , EN COMMANDE, EN PRECOMMANDE, PERDU, PRETE A , AUTRE,etc etc etc"

    Avec cette méthode quand je fait le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def test
    		t = "test <br>"
    		#current_user.methods.each{ |m|
    		#	t += "#{m} <br>"
    		#}
    		t += " has_mangas? => #{current_user.has_mangas?(6)} <br>"
     
    		if(current_user.has_mangas?(6))
     
    			t+="status 6 => #{current_user.mangas.find(6).status}"
    		end
     
    		render :text=>t
    	end
    J'ai une erreur du type
    NoMethodError in MacollectionController#test

    undefined method `status' for #<Manga:0xb6abaf34>

    RAILS_ROOT: ./script/../config/..
    Application Trace | Framework Trace | Full Trace

    /home/fabseven/rails/projetbmanga_01/vendor/rails/activerecord/lib/active_record/base.rb:1863:in `method_missing'
    /home/fabseven/rails/projetbmanga_01/app/controllers/macollection_controller.rb:43:in `test'

    Voila donc mes problèmes :
    - Je ne vois pas comment correctement rajouter un status
    - Je ne vois pas comment visualiser correctement un status
    - La méthode retirer ne marche plus

    Bien sur il me reste toujours la solution débrouiller que je pouvais utiliser avec ma relation précèdente à savoir créer un nouveau objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     lestatus = Status.find(currrent_user.mangas.find(params[:id]).status_id)
     render :text => " (#{ lestatus.id }) #{ lestatus.status } #{ lestatus.description } "
    Mais comme je l'ai déjà dit cela ne me parait pas une solution géniale...

  4. #4
    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
    Si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Status < ActiveRecord::Base
    	has_many :manga_users 
    end
    Il faut mettre dans ta table MangaUser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MangaUser < ActiveRecord::Base
    	belongs_to :manga
    	belongs_to :user
    	
    	belongs_to :status
    end

  5. #5
    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
    Pour accéder à ton status pour un manga d'un user il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = current_user.manga_users.find_by_manga_id(manga_id).status
    et tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    current_user.manga_users.find_by_manga_id(manga_id).status.description
    current_user.manga_users.find_by_manga_id(manga_id).status.id = params[:status]

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    ok, je vais essayer ca dans la semaine et je dirais ce que ca donne, merci en tout cas

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Ca marche bien , le seul hic dans toute l'histoire c'est qu'il faut passer par la table manga_users pour certains actions. Mais bon ca marche donc je suis content

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

Discussions similaires

  1. mieux gérer la relation 1:N sous delphi
    Par adelneo dans le forum Bases de données
    Réponses: 8
    Dernier message: 12/01/2011, 22h11
  2. Réponses: 2
    Dernier message: 26/09/2003, 15h54
  3. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 15h16
  4. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

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