2010-09-27 18 views
1

J'ai un modèle de modèle Rails appelé Orders qui a un type_id, un emplacement et un prix. Chaque type peut avoir plusieurs commandes au même endroit avec des prix différents. Vérifiez ci-dessous pour une idée de la structure de la table.Ruby on Rails obtient des enregistrements par prix le plus élevé

id | type_id | location_id | price 
----------------------------------- 
1 | 1  | 1   | 12 
2 | 1  | 1   | 14 
3 | 1  | 1   | 9 
4 | 2  | 1   | 1 
5 | 2  | 1   | 4 
6 | 3  | 1   | 15 
7 | 3  | 1   | 7 

Je suis désireux essentiellement de sélectionner tous les enregistrements par type_id en utilisant IN exemple:

type_ids = "1,2,3" 
location_id = 1 

Order.find(:all, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids]) 

Je veux seulement sélectionner l'enregistrement avec le prix le plus élevé pour chaque type à cet endroit, de sorte que le résultat l'ensemble ramènerait les enregistrements avec l'ID 2, 5 et 6.

Je n'arrive pas à trouver la requête de recherche pour cela, j'espère que vous comprenez ce que je veux dire. Si ce n'est pas demander, je peux essayer et expliquer mieux.

Vive

Eef

Répondre

2

Si vous voulez juste le plus haut prix unique pour les conditions, vous pouvez utiliser

Order.find(:first, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids], :order => 'price DESC') 

... car cette requête ordonnera les enregistrements correspondants de la plus haute au prix le plus bas, puis vous donner le premier enregistrement (prix le plus élevé).

Si vous voulez que l'élément le plus élevé prix pour chaque type, vous enfreignez hors de la construction des requêtes de Rails et en utilisant un find_by_sql-get the max(price) for each instance of type_id (quelque chose comme SELECT *, MAX(price) FROM orders WHERE location_id = ? AND type_id IN (?) GROUP BY type_id, mais je voudrais exécuter cette requête plusieurs fois contre votre base de données pour l'affiner, moi-même).

À moins que votre nombre de type_id s soit très grand (par exemple, par centaines), il peut être plus simple d'exécuter la requête ci-dessus une seule fois pour chaque type et de mettre tous les résultats dans un tableau; la requête MySQL sera beaucoup plus rapide, en particulier pour les grands nombres de type_id s, mais le faire dans Rails sera suffisant, à moins que vous ne soyez déterminé à obtenir la requête juste MAX(price).

+0

J'ai d'abord écrit l'application en PHP et je faisais une requête à la base de données pour chaque type, ça fonctionnait bien. Je n'aurai jamais plus de 44 types, donc je pense que je vais peut-être adopter une approche plus simple, mais je vais aussi donner un petit peu à la requête. Merci pour ça! – RailsSon