2009-11-17 9 views
0

Je crée une page dans laquelle je souhaite créer une page d'historique. Donc, je me demandais s'il y avait un moyen d'aller chercher toutes les lignes de plusieurs tables et ensuite trier par leur temps? Chaque table a un champ appelé "created_at".Récupérer des données de plusieurs tables et les trier toutes en fonction de leur temps

Alors, y a-t-il un moyen de récupérer toutes les tables et de les trier sans que Rails ne les classe?

+0

Voulez-vous dire plusieurs bases de données ou plusieurs tables dans une seule base de données? –

+0

Désolé, table de ment, pas de base de données – ThoKra

Répondre

1

Vous pouvez obtenir une meilleure réponse, mais je présume que vous auriez besoin de

  1. Créer une table History avec une colonne de date Created, une colonne Id autogenerated, et tout autre contenu que vous souhaitez exposer [ par exemple Name, Description]
  2. Modifier toutes les tables qui génèrent un élément « historique » de consommer cette nouvelle table via la relation de clé étrangère sur History.Id

Les tables "Mashing up" [c'est-à-dire fusionner différents ensembles de résultats en un seul jeu de résultats] sont un problème très difficile, mais vous le feriez dans la couche application, alors pourquoi ne pas le faire correctement? dans la couche de données.

Espérons que cela aide :)

+0

Espérait ne pas avoir à l'utiliser de cette façon;) Mais était-ce de cette façon que je pensais être le plus facile et le plus rapide. – ThoKra

+0

Pourquoi voudriez-vous faire tous les efforts pour créer de nouvelles tables quand vous pouvez utiliser UNION? –

0

Selon que ces bases de données sont tous sur la même machine ou non:

Sur une même machine: Utilisez OrderBy et les déclarations de l'Union dans votre SQL pour retourner votre jeu de résultats

sur des machines différentes: Vous aurez voulez tester cela pour les performances, mais vous pouvez utiliser des serveurs liés et UNION, ORDER BY. Alternativement, vous pourriez avoir ruby ​​obtenir les résultats de chaque DB, puis les combiner et trier

EDIT: De votre dernier commentaire sur les différentes tables et non DB; utiliser quelque chose comme ceci:

SELECT Created FROM table1 
UNION 
SELECT Created FROM table2 
ORDER BY created 
0

Vous devez effectuer les sql comme:

Select * de l'ordre de table par created_at INCR

: Entreposer dans un tableau. Effectuez cela pour chacune des sources de données, puis effectuez un tri de fusion sur tous les tableaux dans Ruby. Bien sûr, cela fonctionnera bien pour les petits ensembles de données, mais une fois que vous aurez un ensemble de données volumineux (c'est-à-dire plus grand que dans la mémoire), vous devrez utiliser un autre algorithme de collecte/fusion.

Donc, je suppose que la réponse est que vous devez effectuer une sorte de Ruby, à moins que vous n'ayez recours à la méthode Union décrite dans une autre réponse.

Questions connexes