277 votes

Exemple de SQL brut dans Rails

Comment puis-je convertir ce code en sql brut et l'utiliser dans rails ? Parce que lorsque je déploie ce code dans Heroku, il y a une erreur de timeout de la demande. Je pense que ce sera plus rapide si j'utilise raw sql.

@payments = PaymentDetail.joins(:project).order('payment_details.created_at desc')
@payment_errors = PaymentError.joins(:project).order('payment_errors.created_at desc')

@all_payments = (@payments + @payment_errors)

3 votes

Pourquoi pensez-vous que le SQL brut sera plus rapide ? Comment savez-vous que c'est un problème de SQL ?

0 votes

Sans voir le plan de requête, je suppose que le problème que vous rencontrez est le classement par created_at. Vous êtes probablement en train de faire un seq scan sur l'ensemble de ces tables (en y ajoutant la table des projets). En faisant deux de ces requêtes en une seule fois avec la méthode du contrôleur sur une grande table et une base de données sous-puissante (les bases de données Heroku sont réglées de manière générique et relativement sous-puissantes pour les dollars que vous dépensez), vous risquez d'obtenir des délais d'attente. Si vous ne faites pas beaucoup d'insertions dans ces tables, vous pouvez utiliser un index trié : devcenter.heroku.com/articles/postgresql-index#sorted-index

1 votes

Il serait toujours plus rapide de couper le code SQL à la main (si vous savez ce que vous faites). Rails fait du sql vraiment méchant. Il fonctionne bien mais pour être général, il doit... être général. Ceci dit, Jim a probablement raison... créer une indexation serait mieux. Essayez d'exécuter votre requête dans pgadmin (contre votre base de données).

0voto

tsauerwein Points 1114

Vous pouvez également mélanger du SQL brut avec des conditions ActiveRecord, par exemple si vous voulez appeler une fonction dans une condition :

my_instances = MyModel.where.not(attribute_a: nil) \
  .where('crc32(attribute_b) = ?', slot) \
  .select(:id)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X