2011-11-01 1 views
0

Les produits sont en vente sur un site Web dans un délai limité. Chaque vente commence à DATE, se termine par DATE et contient au moins un produit.Ai-je besoin de réécrire cette requête SQL dans Rails ActiveRecord?

Chaque produit est associé au numéro d'identification de la vente à laquelle il appartient. Parfois, il y a une courte période de temps où il n'y a pas de produits dans une vente, parce que le gestionnaire a créé la vente mais n'a pas encore fini d'associer les produits à la vente, donc je dois filtrer les ventes sans produits à l'intérieur. liste des ventes à venir, ou il va confondre les utilisateurs.

Dans mon Sale modèle, je suis venu avec ce que je ne suis pas familier avec ActiveRecord:

def upcoming_sales 
    find_by_sql(["SELECT DISTINCT sales.* from sales, products WHERE products.sale_id = sales.id AND sales.start_at > ? AND sales.start_at < ? ORDER BY sales.start_at ASC", Time.now, (Time.now + END_AT)]) 
end 

Je crois que le SQL ci-dessus est standard SQL ANSI qui devrait fonctionner sur à peu près tous les serveurs de base de données , mais peut-il être fait avec ActiveRecord à la place?

En plus de le rendre convivial pour les utilisateurs non-SQL, y a-t-il des avantages à le refaire avec ActiveRecord?

Quelle est la meilleure façon d'améliorer les performances?

Répondre

2

Le SQL brut est difficile à maintenir. Performance sage définitivement sql cru est meilleur, mais considérons les avantages suivants de ActiveRecord. Vous obtenez une belle syntaxe d'interrogation, qui est beaucoup plus lisible étant donné qu'il y en a d'autres qui pourraient avoir besoin de modifier votre code. En outre, ActiveRecord vous permet d'être agnostique pour le moteur de base de données dans une mesure qui ne serait pas possible avec SQL brut. Mais, si vous considérez que les performances sont votre seul goulet d'étranglement, alors ActiveRecord ne répond pas. Je dirais, faites une petite recherche. La requête ci-dessus est une requête de jointure et le SQL définitivement brut vous procurera des avantages de performances notables. Beaucoup d'autres choses peuvent être faites pour améliorer les performances des requêtes de manière spectaculaire, comme indexing, caching, eager loading (lorsque le besoin vient que le chargement parfois impatient rend les requêtes lentes), etc. Avant de quitter ActiveRecord assurez-vous, c'est vraiment le goulot d'étranglement .

2

Bien sûr, vous pouvez écrire sur commande SQL, mais il est conseillé de ne pas quand AR fonctionne très bien (vous obtiendrez homogène code clair, DB indépendant, ...):

def upcoming_sales 
    select('DISTINCT sales.*'). 
    joins(:products). 
    where(["sales.start_at > ? AND sales.start_at < ?", Time.now, Time.now + END_AT]). 
    order("sales.start_at ASC") 
end 
Questions connexes