9
votes

Rails 4 - Loading désireux sur une erreur de sélection dépendante (Rails4 / ACTIVE Admin)

J'ai un panneau actif avec une seule personne à charge, c'est-à-dire que le choix sur la première liste déroulante Sélectionne des impacts ce qui apparaît dans la deuxième liste déroulante.

Tout fonctionnait parfaitement bien il y a quelques mois, mais je viens de réaliser hier, ce n'est pas Travailler plus. p>

J'ai réussi à trouver ce que l'erreur: Si je supprimais le chargement avide ("Inclure"), cela fonctionne à nouveau. strong> p>

ne fonctionne pas: (version actuelle): strong> p> xxx pré>

i Obtenir cette erreur (formulaire chrome dev outils d'outils) p> xxx PRE>

Travailler, lorsque je supprimai "Inclure" / Equipement de chargement: strong> P>

class DealSector < ActiveRecord::Base
  has_many    :deal_subsectors
end

class DealSubsector < ActiveRecord::Base    
  belongs_to  :deal_sector,   :foreign_key => 'deal_sector_id'
end
  • Les rails 4 ont changé la façon dont je devrais utiliser Rechercher (paramètres [: ID] ..) ou la façon dont je devrais utiliser le chargement impatient P> Li>

  • ACTIVE Admin Modifie la façon dont il gère le chargement impatient: peut-être que cela ne fonctionne que sur l'index et non sur les pages d'édition ... P> Li>

  • Turbolinkinks maintenant sur Rails 4 modifie la façon dont je dois faire la charge impatiente? P> li> ul>

    Voici le code: strud> p>

    - sur l'administrateur actif fort> p> xxx pré>

    - la forme avec les 2 sélectionnées 2 dépendantes forte> p> xxx pré>

    - le javascript alimentant: strong> p>

            // for edit page
            var deal_subsector = { };
    
           $(document).ready(function() {
             $('#deal_deal_sector_id').change(function() {
                update_deal_subsector();
             });
           });
    
           function update_deal_subsector() {
               deal_sector_id = $('#deal_deal_sector_id').val(); //get the value of sector id
               url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
              $.getJSON(url, function(deal_subsectors) {
                  console.log(deal_subsectors);
                      $('#deal_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                  for( i = 0; i < deal_subsectors.length; i++) {
                     console.log(deal_subsectors[i]);
                     $('#deal_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
          };
        }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
      };
    
              // for index page (filters)
              $(document).ready(function() {
                  $('#q_deal_sector_id').change(function() {
                     update_deal_subsector_filter();
                  });
                  });
    
              function update_deal_subsector_filter() {
                   deal_sector_id = $('#q_deal_sector_id').val(); //get the value of sector id
                   url = '/admin/deals/deal_subsectors_by_deal_sector?deal_sector_id=' + deal_sector_id; //make a query to the url passing the deal sector id as a parameter
                   $.getJSON(url, function(deal_subsectors) {
                          console.log(deal_subsectors);
                    $('#q_deal_subsector_id').html("") //just blanks the id, blank it before populating it again if sector changes
                     for( i = 0; i < deal_subsectors.length; i++) {
                         console.log(deal_subsectors[i]);
                         $('#q_deal_subsector_id').append("<option value=" + deal_subsectors[i].id + ">" + deal_subsectors[i].name + "</option>")
          };
        }); //pass the url and function to get subsector ids and all we get is assigned to the variable subsector_id
            };
    


0 commentaires

3 Réponses :


2
votes

Lorsque vous appelez activeCord :: Trouver - Cela signifie que vous attendez d'obtenir un seul modèle unique de la DB. Ensuite, vous vous référez à ce modèle et appelez DealSubsectors - Je suppose que c'est has_many relation à votre modèle. Il produira 2 requêtes: d'abord chercher l'original DealSelector , Deuxièmement - Tous les COMPRESSUPTORSSECTORS . Il n'y a rien que vous puissiez optimiser (sauf si vous DealSubsectors est une méthode personnalisée dans votre modèle, pas la relation).

Si vous voyez que quelque chose frappe votre dB avec des requêtes - vous devez regarder dans un autre endroit. Dites, votre formulaire - affichez-vous un seul client par formulaire? Sinon, cela ira et récupère à nouveau tous les transstrautrices et réaliseront à nouveau tous les nouveaux clients. Essayez de fournir plus de code.


3 commentaires

Oui, il a une relation has_many. Eh bien, quand vous dites que vous ne pouvez rien optimiser, mais je ne pense pas que ce soit vrai: je pensais que Egaer Chargement de WXAS signifie précisément de charger les ressources associées dans un appel afin que la requête soit plus efficace. Donc, ici, je veux que je veux charger avec le secteur du jeu des sous-secteurs associés. Je vais ajouter du code sur les relations modèles. Dis-moi quel autre code dont vous auriez besoin.


Utilisation de ce code, vous ne pouvez aucun moyen que vous puissiez utiliser la charge désireuse: alSector.find (Params [: Deal_Sector_ID]). Deal_subsectors - Vous pouvez l'exécuter à partir de la console (rails c) et voir les requêtes. Il tire 2 requêtes: pour trouver troncsector et pour chercher DealSubsectors . Vous devez penser à d'autres endroits où vous chargez des modèles - par exemple. à votre avis.


bien sûr. Ce que je m'attends à ce que cette question ne soit pas à dire, cela ne fonctionne pas tel quel. je sais que. Ce que j'attends, c'est plutôt comment je peux parvenir à accélérer les sous-secteurs de la transaction. Je sais pour un fait que vous pouvez accueillir des modèles de charges sur l'administrateur actif avec: inclut mais j'ai besoin de conseils et de réponses pour m'aider à le faire avec des réponses ou des idées précises.



0
votes

Pourquoi ne pouvez-vous pas simplement récupérer les enregistrements Tous DealSSubsector pour le Secteur_Id CODE>?

DealSubsector.where(deal_sector_id: params[:deal_sector_id])


1 commentaires

Yury remercie mais je ne dis pas ce que j'utilisais ne fonctionnait pas. Cela fonctionne parfaitement: @deal_subsectors = DealSector.Find (paramètres [: Deal_Sector_ID]). Deal_Subsectors Mais je veux utiliser le chargement impatient.



1
votes

Rails 4 vient avec quelques modifications concernant l'algorithme de charge impatiente. Vous pouvez essayer les extraits de code ci-dessous dans votre cas:

@deal_subsectors = DealSector.includes(:deal_subsectors).find(params[:deal_sector_id]).dealsubsectors


3 commentaires

semble fonctionner. Juste une question: est-il normal que la vitesse de chargement que je puisse voir à l'intérieur de mon terminal est plus élevée avec @deal_subsectors = @deal_subsectors = DealSector.eger_eger_Arger (: Deal_Subsectors) .Find (parames [: Deal_se Ctor_id]). Deal_subse CTors que lorsque je Ne faites pas de chargement avaié (@deal_subsectors = DealSector.Find (Params [: Deal_Sector_ID]). Deal_subsectors? Comme je n'ai pas de sous-secteurs (comme moins de 20 ans pour le moment), il est peut-être normal que la charge animée prend plus de temps que sans dépenser . Serait-il juste de dire que l'EagyLoad va payer lorsque j'aurai beaucoup plus de sous-secteurs?


Oui @Mathieu Vos pensées sont absolument correctes. La plupart du temps impatient de vous libérer du piège de requête N + 1, sans chargement impatient que vous pouvez exécuter 100 requis pour obtenir 1 résultat au lieu d'exécuter 1 requête pour obtenir 100 résultats. Le chargement désireux paiera toujours, peut-être que vous pourriez avoir une ou deux exceptions près. Dans votre cas, chargez de réduire définitivement le temps de requête et faites votre réponse rapidement. plus grand non. des données, vous aurez plus d'avantages que vous recevrez du chargement impatiété.


TX pour vos explications supplémentaires