2013-09-23 7 views
0

Je rencontre des problèmes avec les performances de mon application rails. Cela pourrait être l'effet d'une mauvaise structure de base de données. Et la page est fréquemment vue par les utilisateurs, considérant que l'enregistrement est 5k +.Le meilleur moyen de rechercher des enregistrements

Current System: 

Model: 
person has_many payment 

Controller: 
@total_payments = 0 
person.each do |p| 
    @total_payments += p.payments.map(&:value).sum 
end 

View: 
@total_payments 
  • Est-il préférable d'avoir une base de données séparée pour un compteur que pour rechercher et compter les enregistrements?
  • Quelle structure de base de données recommandez-vous/conseil?
+0

Qu'est-ce que 'person.each'? Je suppose que ça devrait être 'persons.each'? En plus c'est le contrôleur des paiements? –

+1

Essayez d'utiliser 'mini-profiler' dans votre base de données pour voir comment les choses accèdent à votre base de données. Vous pouvez également faire un 'Rails.cache.fetch' et' memcache' ou 'dahli | memcache' les sommes de paiement. Cela augmentera votre mémoire, mais offrira une expérience plus rapide. – kobaltz

+0

Merci. Je vais essayer mini-profiler puis faire un memcache – fujisan

Répondre

2

En supposant persons est une relation activerecord

persons.joins(:payments).sum(:value) 

Si persons est déjà un tableau (moins préféré)

Payment.where(:person_id => persons.map(&:id)).sum(:value) 

Si le total le paiement est le seul besoin d'attribut des paiements associés dans cette vue. Ensuite, la méthode la plus rapide serait de faire total_payments un champ dans le tableau person. Mettez-le à jour chaque fois qu'un payment associé est créé. Quelque chose de similaire à la cache du compteur. Ensuite, vous n'aurez pas besoin de faire une requête SQL pour les paiements du tout.

0

Vous pouvez essayer de faire quelque chose comme Payment.select ('value') en tant que requête de base, de sorte que vous ne faites qu'une seule requête et que vous en mappez à la place.

0

Pourriez-vous essayer

@total_payments += p.payments.pluck(:value).sum

Cela ne sélectionnez le value de chaque paiement au lieu de tous les champs de la table. Vos tables sont-elles indexées sur le person_id dans le tableau Payment? Cela permettrait également d'accélérer la base de données.

(sur atm mobile ne peut donc pas beaucoup plus profond plonger)

Questions connexes