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 Discussion :

RoR 4.2.1 inherite polymorphic


Sujet :

Ruby

  1. #1
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    à la recherche d'un travail comme programmeur web full-stack junior
    Inscrit en
    décembre 2016
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : à la recherche d'un travail comme programmeur web full-stack junior
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2016
    Messages : 347
    Points : 344
    Points
    344
    Par défaut RoR 4.2.1 inherite polymorphic
    Bonjour,
    Je cherche à faire du polymorphisme avec des classes hérités.
    à savoir:
    Ma structure:
    une class Payment
    Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class Payment < ActiveRecord::Base
    belongs_to :payment_method, polymorphic: true
    end
    une class InternalCredit
    Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class InternalCredit < ActiveRecord::Base
    has_many :payments, as: :payment_method
    end

    une class GiftCard < InternalCredit

    Je possèdes donc 2 tables dans la BDD
    Payment
    InternalCredit

    Mon soucis
    Payment.create!(payment_method: GiftCard.find_by(code: :gift_1))
    Actuellement payment_method_type devient un InternalCredit

    Comment dois-je faire pour que le record enregistres payment_method_type: typeDeMaClass dans la bdd ?




    Merci d'avance,
    Sparky

  2. #2
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : juin 2004
    Messages : 1 060
    Points : 1 466
    Points
    1 466
    Billets dans le blog
    3
    Par défaut
    la solution consiste à faire en sorte que type DeMaClass hérite de la classe InternalCredit.
    intel i7
    Mint 20
    Plasma et Cinnamon

  3. #3
    Membre averti
    Avatar de Sparky95
    Homme Profil pro
    à la recherche d'un travail comme programmeur web full-stack junior
    Inscrit en
    décembre 2016
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : à la recherche d'un travail comme programmeur web full-stack junior
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2016
    Messages : 347
    Points : 344
    Points
    344
    Par défaut
    Bonjour,
    Je n'avais pas vu votre réponse
    Voici comment je l'ai "solutionné"/patché

    Dans ma class payment
    J'ai forcé le type à la creation
    Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    before_create do
        #FIXME: conflict between Polymorphisme & inherit
        if payment_method_type == InternalCredit.name
            #FIXME: HACK TO FIX problem of polymorphic inherited association
            self.payment_method_type = InternalCredit.find(payment_method_id).class.name
        end
    end

    Ca fait le taff mais je dois l'avouer c'est dégueulasse

    Bonne journée

  4. #4
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : juin 2004
    Messages : 1 060
    Points : 1 466
    Points
    1 466
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Sparky95 Voir le message

    Ca fait le taff mais je dois l'avouer c'est dégueulasse

    Bonne journée
    Le problème est que les langages de programmation peuvent géré les polymorphismes, mais rarement les bases de données. Alors avec un problème comme celui-là on doit inclure un champ qui indique le type de paiement, on ne s'en sort pas. Mais Ruby permet d'étendre une classe existante. J'aurais opter pour la création d'une méthode de détection dans la classe paiement.

    Dans ce cas, tu peux le faire de cette façon quand tu n'as pas accès à la classe.

    def Payment.payment_type

    end

    Idéalement, je changerais la définition de la classe Paiement et je remplacerais le champs polymorphic par un champs avec le nom de type. Un truc à trois ou quatre caractère. Certaines base de donnée ont un type de champs spécialement pour ce type de situation. D'après ce que je comprend, tu veux géré deux types de paiement: Carte de crédit et carte-cadeau. Du coté de Ruby, je représente les choses par deux classes dérivé de la classe Paiement: la classe Carte_cadeau et la classe Carte_credit. Tous deux classes auront une fonction écrit qui ajoutera le nom de type au moment de l'écriture. Et du coté de la BDD, une représentation commune avec un champ numérique et un champ avec le nom de type. Et dans la classe de la base de donnée une fonction de lecture que je nommerais acces qui changera le contenu de la base de donnée dans la classe approprié: Carte_cadeau ou Carte_credit.

    J'aimerais que tu m'explique la tâche que tu cherche à accomplir parce que la classe Arrays a des fonction spéciales de filtrage pour travailler avec des lots, comme map et collect. Mais il existe également une fonction Find en SQL qui peut faire le travail plus rapidement avec moins d'effort pour le serveur.
    intel i7
    Mint 20
    Plasma et Cinnamon

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

Discussions similaires

  1. Fonction polymorphe et conteneur stl.
    Par Captain Fizzou dans le forum SL & STL
    Réponses: 2
    Dernier message: 29/11/2004, 19h13
  2. Inherited et Fail
    Par WebPac dans le forum Langage
    Réponses: 12
    Dernier message: 14/09/2004, 13h09
  3. Réponses: 3
    Dernier message: 27/07/2004, 12h01
  4. [Conception][Factory] Packages inheritance
    Par ludovic.fernandez dans le forum Général Java
    Réponses: 5
    Dernier message: 05/07/2004, 17h02
  5. Instructions ROL et ROR
    Par bigbang dans le forum Assembleur
    Réponses: 13
    Dernier message: 01/03/2003, 02h06

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