Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment return un objets JSON en fonction d'une bd

    17 juin 2022 à 16:57:28

    Bonjour, je bloque sur ca depuis maintenant un moment.

    Je dev une food app en Ruby, et je dois afficher les recettes que je peux faire si j'ai tout les ingrédients requis.

    Et par la suite je devrais afficher les ingrédients manquants aux recettes, mais ca viendras après.

    De toute façon une fois que j'aurai la logique, ca devrai découler.

    J'ai un gros fichier JSON qui contient pleins de recettes, ex d'un objet :

        {"rate": "5", "author_tip": "", "budget": "bon marché", "prep_time": "15 min", "ingredients": ["600g de pâte à crêpe", "1/2 orange", "1/2 banane", "1/2 poire pochée", "1poignée de framboises", "75g de Nutella®", "1poignée de noisettes torréfiées", "1/2poignée d'amandes concassées", "1cuillère à café d'orange confites en dés", "2cuillères à café de noix de coco rapée", "1/2poignée de pistache concassées", "2cuillères à soupe d'amandes effilées"], "name": "6 ingrédients que l’on peut ajouter sur une crêpe au Nutella®", "author": "Nutella", "difficulty": "très facile", "people_quantity": "6", "cook_time": "10 min", "tags": ["Crêpe", "Crêpes sucrées", "Végétarien", "Dessert"], "total_time": "25 min", "image": "https://assets.afcdn.com/recipe/20171006/72810_w420h344c1cx2544cy1696cxt0cyt0cxb5088cyb3392.jpg", "nb_comments": "1"},
    

    J'ai une table Fridge, qui contient juste une colonne id, et content (pour le nom de l'ingrédient)

    J'ai un beau CRUD pour les ingrédients, voici le controlleur :

    class FridgesController < ApplicationController
    
        
        def index
            @fridge = Fridge.all
            #RECIPES :
            @data = JSON.parse(File.read('recipes.json'))
    
        end
    
        def result
    
        end
    
        def show
            @fridge = Fridge.find(params[:id])
        end
        
        def new
            @fridge = Fridge.new
        end
        
        def create
            fridge = Fridge.create(fridge_params)
        
            redirect_to action: "index"
        end
        
        def edit
            @fridge = Fridge.find(params[:id])
        end
        
        def update
            @fridge = Fridge.find(params[:id])
        
            @fridge.update(fridge_params)
        
            redirect_to action: "index"
        end
        
        def destroy
            @fridge = Fridge.find(params[:id])
            @fridge.destroy
        
            redirect_to fridges_path
        end
        
        private
        
        def fridge_params
            params.require(:fridge).permit(:content)
        end
        
      
    end

    et Voici a view index :

    <table>
      <% @fridge.each do |item| %>
        <tr>
          <td><%= link_to item.content, fridge_path(item) %></td>
          <td><%= button_to 'Edit', edit_fridge_path(item), method: 'get'%></td>
          <td><%= button_to 'Remove', fridge_path(item), method: 'delete', data: { confirm: 'Are you sure?' } %></td>
      <% end %>
    </table>
    
    <%= link_to "Add a New Item", new_fridge_path %>

    Le problème étant que je ne sais pas du tout comment m'y prendre. J'ai essayé avec une succession de each, mais j'ai pas réussi.

    Merci d'avance pour votre aide :)




    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2022 à 0:53:44

      Salut,

      Tu dois avoir une table Recette, une table Ingrédient et une relation n-n entre elles. Dans cette table de relation, tu as en clés étrangères, les clés primaires des tables Recette et Ingrédient, puis tu as une colonne "quantité" qui est de type INT (ou assimilé, comme TINYINT par exemple), puis une colonne "type_d_unité" en VARCHAR(x) (par exemple "grammes", "litres", ...).

      Ensuite, dans ta liste d'ingrédients que tu possèdes, ainsi que la quantité de chacun d'eux, tu compares avec les requêtes SELECT depuis la table de relation. D'abord, je vérifierais si l'on possède l'ingrédient. OUI ? On vérifie si la quantité est suffisante. OUI ? On passe à l'ingrédient suivant, et ainsi, au moindre NON, on passe à la recette suivante. Mais, si tu veux lister les recettes impossibles à faire et pour quelles raisons (quels ingrédients manquent-ils ?) tu devras passer TOUS les ingrédients de la table de relation en revue.

      Pour Ruby, je peux pas aider, je connais de nom seulement.

      Et tu peux dire à tes parents que je les kiffe même si je les connais pas. Sortir une contrepèterie avec ton prénom et ton nom, fallait oser. Ils l'ont fait ! :soleil:

      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2022 à 12:28:03

        Salut,

        Oui du coup j'ai bien saisi ta façon de faire. Effectivement avoir une table recipes serait plus logique, masi cepandant, ca m'embête de ne pas utiliser se JSON :/

        Ahahhaha, pas mal le nom prénom hein x)

        En tout cas merci de ta réponse :)

        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2022 à 20:21:53

          Le problème, selon moi, c'est qu'il sera difficile de parser "600g de pâte à crêpes". Quand s'arrête la quantité, quand commence l'ingrédient ? Alors qu'avec :

          Ingrédients : {id_ingrédient (PK) = 123, nom_ingrédient = "pâte à crêpe"} ;

          Recettes : {id_recette (PK) = 456, nom_recette = "Crêpes à j'sais pas quoi"} ;

          Ingredient_recette : {Ingredient (FK(Ingrédients)), Recette (FK(Recettes), quantité = 600(int), type = "gramme"}

          SELECT IR.quantité, IR.type, I.nom_ingrédient FROM
          Ingrédients as I JOIN Ingrédient_recette as IR ON I.id_ingrédient = IR.Ingredient JOIN Recettes as R ON IR.Recette = R.id_recette
          WHERE IR.Ingredient = 123 AND IR.Recette = 456;
          
          Tu récupères (si je ne me suis pas planté) :
          600 | "gramme" | "pâte à crêpes
          



          Tu mets ça dans un dico :

          {quantité ; type ; "ingrédient} que tu pourras parcourir.

          Concernant l'utilisation de JSON, c'est une contrainte ? Logiquement, quand on a beaucoup de données, on les stocke dans un fichier ou mieux dans une BDD. Je crois qu'on peut stocker du JSON dans un fichier, donc, dans ce cas, rien ne t'empêche d'ajouter une table JSON (je sais pas si c'est le bon terme) qui fait office de relation entre ingrédients et recettes.

          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2022 à 13:30:15

            Après, je pensais, ne pas renseigner la quantité, car quand on cherche une recette en général je pense que on renseigne pas forcément nos quantités, tu va chercher une recette en renseignant que tu as 300g de sucre (tu vois ce que je veux dire).

            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2022 à 23:28:42

              "tu va pas chercher une recette en renseignant que tu as 300g de sucre (tu vois ce que je veux dire ?)"

              Je pense que tu voulais dire ça.

              Si c'est ça, oui, je vois. Maintenant, je croyais que tu voulais un truc précis et lorsqu'un utilisateur allait faire une recette, il l'indiquait, et on lui retirait la quantité d'ingrédient pour la recette et que ça mettrait à jour les recettes qu'il pourrait faire.

              J'ai regardé un peu ce qu'était le JSON, ça n'a pas l'air compliqué, même si je n'ai fait que de la lecture. Vu que tu dis avoir fait ton propre CRUD, je pense que le mieux, c'est de poster les scripts qui te posent problème. Parce qu'au contraire, on partirait chacun sur une idée, alors que si ça se trouve, tu as juste 2 ou 3 choses à modifier et ce sera ok.

              • Partager sur Facebook
              • Partager sur Twitter
                20 juin 2022 à 14:20:18

                Enfaite j'ai un crud qui permet de ajouter des ingrédients à notre table. Et j'ai le fichier "recipes.json" qui contient toutes les recettes avec les auteurs / budget / note / etc...

                Et celon moi, quand on recherche une recette le mieux c'est de renseigner juste les ingrédients que l'on a chez nous, sans forcément mettre les dosages (pour gagner du temps), maintenant on est de plus en plus feignant x).

                • Partager sur Facebook
                • Partager sur Twitter

                Comment return un objets JSON en fonction d'une bd

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown