2010-10-12 5 views
3

Disons que j'ai des pommes, des oranges et des melons, et que chacune a une colonne "created_at". Comment est-ce que je construirais une requête ActiveRecord/SQL pour trouver les 10 pommes, oranges et melons les plus récents? Y a-t-il une manière élégante de faire ceci?Sélection parmi plusieurs tables dans Rails

+0

-ce que ces types distincts - à savoir avez-vous une pomme, classe orange et melon, ou avez-vous un seul Classe de fruits avec un attribut fruit_name? – Codebeef

Répondre

2

Si vous avez ces types dans des tables distinctes, alors je ne pense pas que vous pouvez le faire dans une seule requête SQL.

Vous pouvez trouver ids et les types de documents les plus récents comme celui-ci:

SELECT * FROM 
(SELECT 'Apple' AS class, id, created_at FROM apples LIMIT 10 
UNION 
SELECT 'Orange' AS class, id, created_at FROM oranges LIMIT 10 
UNION 
SELECT 'Melon' AS class, id, created_at FROM melons LIMIT 10) AS most_recent 
ORDER BY created_at 
LIMIT 10; 

utilisent ensuite ces enregistrements pour chercher des objets particuliers par id.

Mais si vous le pouvez, essayez de stocker tous ces éléments dans une seule table en utilisant le modèle d'héritage de table unique, qui est built-in into rails. Cela fonctionnerait bien si les types partageaient beaucoup de champs. Ensuite, vous pouvez simplement utiliser un seul appel Fruit.find avec order et limit pour aller chercher ce que vous voulez.

Rails 2:

Fruit.find(:all, :order => "created_at", :limit => 10) 
0

Non testé, mais cela devrait fonctionner

Apples.joins(:oranges).joins(:melons).order("apples.created_at,oranges.created_at,melons.created_at DESC").limit(10) 
Questions connexes