Est-ce que Ruby on Rails tableau « has_many » fournir des données sur un « besoin de savoir »?

StackOverflow https://stackoverflow.com/questions/2891940

Question

Sur Ruby on Rails, par exemple, si l'objet modèle de l'acteur Tom Hanks, et les fans "has_many" est 20 000 objets Fan, puis

actor.fans

donne un tableau avec 20.000 éléments. Probablement, les éléments ne sont pas pré-remplis avec des valeurs? Dans le cas contraire, obtenir chaque objet Acteur de la DB peut être beaucoup de temps.

Il est donc sur une base « besoin de savoir »?

Alors faut-il tirer des données lorsque j'accéder actor.fans [500], et les données de traction lorsque j'accède actor.fans [0]? Si elle saute de chaque enregistrement à enregistrer, alors il ne sera pas en mesure d'optimiser les performances en faisant lecture séquentielle, ce qui peut être plus rapide sur le disque dur parce que ces dossiers pourraient être dans le secteur à proximité / couche de plateau - par exemple, si le programme touche 2 éléments aléatoires, alors il sera plus rapide juste pour lire ces 2 dossiers, mais si elle touche tous les éléments dans un ordre aléatoire, il peut être plus rapide que de lire tous les enregistrements de manière séquentielle, et traiter ensuite le hasard éléments. Mais comment RoR savoir si je fais quelques éléments aléatoires ou tous les éléments de hasard?

Était-ce utile?

La solution

Pourquoi voudriez-vous chercher si vous 50000 enregistrements utilisez seulement deux d'entre eux? Alors seulement aller chercher les deux de DB. Si vous voulez la liste des fans, vous utiliserez probablement la pagination -. À savoir la limite d'utilisation et offset dans votre requête, ou un petit bijou de paginations comme des will_paginate

Je ne vois pas d'explication logique pourquoi devriez-vous aller la façon dont vous essayez de. Expliquer une situation réelle afin que nous puissions vous aider.

Cependant, il y a penser que vous devez savoir chargement Wile de nombreux objets associés de DB - Utilisation: comprennent comme

Actor.all(:include => :fans)

sera avide de charge tous les fans donc il n'y aura que 2 requêtes au lieu de N + 1, où N est une quantité d'acteurs

Autres conseils

Regardez le SQL qui est vomie par le serveur en mode de développement, et qui vous indiquera le nombre d'enregistrements de ventilateur sont chargés. Dans ce cas actor.fans sera en effet les amener tous à charger, ce qui est sans doute pas ce que vous voulez.

Vous avez plusieurs options:

  • Utilisez un paginator comme suggéré par Tadas;
  • Configurer une autre association avec les fans table qui tractions en seulement ceux qui vous intéressent. Cela peut se faire soit avec des conditions sur la déclaration has_many, par exemple
    has_many :fans, :conditions => "country of residence = 'UK'"
  • Spécification de la version complète de SQL pour limiter les lignes retournées avec l'option :finder_sql
  • Spécifier l'option :limit qui va, bien, limite, le nombre de lignes renvoyées.

Tout dépend de ce que vous voulez faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top