2016-11-04 1 views
0

Ich habe zwei ähnliche Tabellen in Schienen namens Nachrichten und Nachrichtenhistorien. In regelmäßigen Abständen entfernen wir die alten Daten aus der Nachrichtentabelle und legen sie in message_histories ab.Wie verschmelzen mehrere und unterschiedliche ActiveRecord Query in Rails und Paginate über die Datensätze?

Jetzt möchte ich einen Bericht über die Anzahl der Nachrichten generieren, die nach app_id gruppiert sind und die in der Tabelle message und message_history vorhanden sind.

Gibt es eine Möglichkeit zur Abfrage [Nachricht & MessageHistory] Modell und Paginieren auf den Aufzeichnungen.

Derzeit verwende ich die folgende Schritt, Es sieht komisch, aber vorschlagen, einen besseren Weg, dies zu tun:

@messages = Message.select("SUM(devices_count) as count ,CAST(run_at AS DATE) AS date").where(:app_id => @app.id).where("last_run_date is not ?", nil).group("CAST(run_at AS DATE)").order("date desc") 
@messages << MessageHistory.select("SUM(devices_count) as count ,CAST(run_at AS DATE) AS date").where(:app_id => @app.id).where("last_run_date is not ?", nil).group("CAST(run_at AS DATE)").order("date desc") 
@messages = @messages.flatten.paginate(:page => params[:page] || 1, :per_page => 100) 
+0

Nicht bewusst, eine saubere Möglichkeit, diese Schienen Weg zu tun, aber Sie können gehen für ActiveRecord :: Base.connection.execute() 'und führen Sie die Abfrage über beide Tabellen –

+0

können Sie etwas wie" polymorphe Assoziation "für Nachrichten Geschichte, wie es eine Form von Nachrichten ist. keine zweite Tabelle für Nachrichtenhistorien –

Antwort

0

Es klingt wie das, was Sie wollen UNION den beiden Tabellen ist, dann die Ergebnisse Paginieren.

Für einige Beispiele siehe ActiveRecord Query Union, und betrachten Sie die active_record_union Edelstein (was macht es einfacher, UNIONs mit ActiveRecord zu tun).

Es bedarf einiger Experimente, um herauszufinden, wie die where-Klausel Filter und Summen/Gruppen richtig angewendet werden!

Verwandte Themen