Forum Programmation.ruby Rails : Association multiple

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
0
27
avr.
2020

Bonjour,

Dans le cadre de mon premier projet en rails, je dois gérer une relation multiple :

Les Products, Categories et Vendors peuvent avoir une ou plusieurs References.

    +---------+
    | Product |
    +---------+
    | name    |
    | ...     |
    +---------+
         |
         |
    +-------------+
    | Reference   |
    +-------------+
    | name        |
    | ...         |_____+----------+
    | product_id  |     | Category |
    | category_id |     +----------+
    | vendor_id   |     | name     |
    +-------------+     | ...      |
          |             +----------+
          |
      +--------+
      | Vendor |
      +--------+
      | name   |
      | ...    |
      +--------+

Maintenant que les associations sont crées, je ne peux pas créer un objet reference sans qu'il ait obligatoirement un product_id ET un category_id ET un vendor_id

J'ai dû oublier quelque chose mais quoi ?

  • # Du code !

    Posté par  (Mastodon) . Évalué à 2.

    Tu pourrais nous dire comment tu as déclaré des modèles ?

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Du code !

      Posté par  (site web personnel) . Évalué à 1. Dernière modification le 27 avril 2020 à 14:50.

      En gros :

      // app/models/product.rb
      class Product < ApplicationRecord
        has_many :references
      end
      
      // app/models/vendor.rb
      app/models/vendor.rb
      class Vendor < ApplicationRecord
        has_many :references
      end
      
      // app/models/category.rb
      app/models/category.rb
      class Category < ApplicationRecord
        has_many :references
      end
      
      // app/models/reference.rb
      class Reference < ApplicationRecord
        belongs_to :vendor
        belongs_to :product
        belongs_to :category
      end
      • [^] # Re: Du code !

        Posté par  (Mastodon) . Évalué à 2.

        Le comportement correspond à ce que tu as demandé :
        - un produit peut avoir plusieurs références
        - un vendor peut avoir plusieurs références
        - une catégorie peut avoir plusieurs références
        - une référence appartient à un vendor ET un product ET une categorie

        Je pense que dès ton schéma (celui que tu as posté) il y a une erreur.

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: Du code !

          Posté par  (site web personnel) . Évalué à 1.

          Je suis d'accord c'est un problème de modélisation sûrement lié à mon manque d'expérience, mais comment on résout ce genre de problème en général ?
          Il me faudrait 3 modèles séparés :

          • ProductReference
          • VendorReference
          • CategoryReference

          ?

          • [^] # Re: Du code !

            Posté par  (Mastodon) . Évalué à 2.

            Tu peux expliquer en clair ce que tu veux faire ? En fait tu veux que les produits, les vendor et les category aient chacun une référence ? Qu'est-ce que tu appelles une référence ? Si c'est un simple identifiant unique tu peux le mettre en simple attribut de product, vendor et category.

            En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

            • [^] # Re: Du code !

              Posté par  (site web personnel) . Évalué à 1.

              Une référence c'est tout simplement un lien (nom et URL).

              Les Vendors, Categories et Products on chacun un ou plusieurs liens.

              • [^] # Re: Du code !

                Posté par  (Mastodon) . Évalué à 2.

                Est-ce que ça peut être tout simplement un attribut de vendors, category et product ? Tu vas faire qqchose de particulier de ces liens ? En d'autres termes, as-tu réellement besoin d'un modèle "reference" ? Quels attributs vas-tu y mettre autre que l'URL ?

                En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

          • [^] # Re: Du code !

            Posté par  . Évalué à 2.

            Salut,

            Faut tout péter. :)

            Ça me semble effectivement un problème de modélisation.

            Les "super" gros problèmes auxquels je n'ai pas de "giga" réponse au niveau BDD classique, c'est ceux concernant le spatio-temporel où la, il y a probablement un trou dans la raquette.

            Pour le reste, ça va à peu près.

            mais comment on résout ce genre de problème en général ?

            Je dirais qu'il y a deux méthodes :

            • l'une, plutôt utilisée en entreprise, c'est l'expérience,
            • l'autre, plus pour les utilisateurs classiques, lire et relire des cours, tant que "lapin compris".

            Je ne dis pas par là que tu ne suis pas la méthode 2, c'est celle que tu semble suivre et c'est bien ! C'est aussi celle qui permet à arriver à la 1 ensuite et se poser moins de questions :)

            Plutôt qu'un schéma, essaie de formaliser en mots les relations que tu souhaite introduire. C'est peut-être plus compliqué qu'un petit graphique, mais ça en dit long. Est-ce plutôt une relation 1:1, une relation 1:n, une relation n:n ?

            Je dis pas que faire un schéma est mal non plus, mais si tu es bloqué, il faut peut-être changer de méthode. Au moins juste pour voir ;)

            Matricule 23415

            • [^] # Re: Du code !

              Posté par  (Mastodon) . Évalué à 2.

              Après je le faisais un peu bosser sur son propre schéma pour justifier éventuellement la classe "référence". Si il y en a réellement besoin, la solution technique (et élégante) existe en Rails, c'est les associations polymorphiques.

              En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

              • [^] # Re: Du code !

                Posté par  (site web personnel) . Évalué à 1.

                Je ne connaissais pas ça, je vais y jeter un oeil, merci !

              • [^] # Re: Du code !

                Posté par  . Évalué à 1.

                Salut,

                Après je le faisais un peu bosser sur son propre schéma

                Ouip, je crois bien aussi que c'est là que le problème se pose ;)

                Matricule 23415

              • [^] # Re: Du code !

                Posté par  (site web personnel) . Évalué à 2.

                Merci, c'est bien les associations polymorphiques qui répondent au problème.

            • [^] # Re: Du code !

              Posté par  (site web personnel) . Évalué à 1.

              Merci à tous les 2.

              Concernant l'expérience, c'est mon premier projet d'envergure avec un framework Web.

              Pour préciser, j'aurais potentiellement plusieurs références pour chaque Product/Vendor/Category donc je ne peux pas créer un attribut url pour ces modèles sans avoir à faire un truc moche genre url1, url2, …

              Category 0,N --- 1,1 Reference (Une catégorie peut avoir 0 à N Références et une référence est liée à une seule catégorie)
              Vendor 0,N --- 1,1 Reference (même principe)
              Product 0,N --- 1,1 Reference (même principe)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.