2016-03-19 5 views
1

Ich steckte auf eine Abfrage, die ich benutze (und ist im Grunde eine Raw-SQL) auf eine Abfrage mit ActiveRecord Methoden. Der Grund, warum ich versuche, es zu konvertieren, ist, dass ich Bereiche eins verwenden muss.Rails 4 - Wie schreibt man ".find_by_sql" mit ActiveRecords Methoden in die Abfrage um?

find_by_sql("SELECT 
       COUNT(s.id) AS count_all, 
       SUM(s.gross_profit) AS sum_gross_profit, 
       se.user_id, 
       u.id, 
       u.first_name, 
       u.last_name, 
       u.role 
      FROM shipments s 
      INNER JOIN senders se ON se.id = s.sender_id 
      INNER JOIN users a ON a.id = se.user_id 
      WHERE ((#{status}) 
       AND (se.admin_id IS NOT NULL) 
      GROUP BY se.user_id 
      ORDER BY count_all DESC") 
    } 

Wie alle Abfrage diejenigen s, se, u Aliase und 2 INNER JOIN s in ein Active konvertieren?

EDIT: Was ich habe versucht:

select("COUNT(shipments.id) AS count_all, 
     SUM(shipments.gross_profit) AS sum_gross_profit, 
     senders.admin_id, 
     users.id, 
     users.first_name, 
     users.last_name, 
     users.role") 
.joins("INNER JOIN senders ON senders.id = shipments.sender_id 
     INNER JOIN users ON users.id = senders.user_id") 
.where("((#{status}) 
      AND (senders.admin_id IS NOT NULL)") 
.group("senders.user_id") 
.order("count_all DESC") 

Aber das gibt nur eine Ausgabe wie folgt aus:

{16=>41, 46=>34, 54=>2, 55=>1, 56=>1}:Hash 

Danke

+0

Was haben Sie versucht? Hast du das AR-Dokument gelesen? http://guides.rubyonrails.org/active_record_querying.html Betrachten Sie Joins, enthält, wo, zählen, Gruppe. –

+0

Hinzugefügt die aktuelle Abfrage, die ich versuche .... – user984621

+0

Wenn Sie Fragen wie diese haben, ist es am besten, sie in sql – phoet

Antwort

0

Es sieht aus wie das, was Sie wollen auf die Ende sind User Instanzen, mit ein paar zusätzlichen Attributen. In diesem Fall wird ActiveRecord FROM users verwenden, daher müssen Sie Ihre Joins etwas umschreiben. Da alles ein INNER JOIN ist, ist das einfach. Also würde ich dies tun:

User.select("COUNT(shipments.id) AS count_all, 
     SUM(shipments.gross_profit) AS sum_gross_profit, 
     senders.admin_id, 
     users.*") 
.joins("INNER JOIN senders ON senders.user_id = users.id 
     INNER JOIN shipments ON shipments.sender_id = senders.id") 
.where("(SOMETHING HERE) 
      AND senders.admin_id IS NOT NULL") 
.group("users.id") 
.order("count_all DESC") 

ich die #{status} nahm, weil das wie eine ernsthafte Sicherheitslücke sieht. Sie sollten lernen, wie man where("foo = ?", bar) verwendet, um SQL-Injection zu verhindern.

Auch in der ursprünglichen SQL gab es einige nicht übereinstimmende Parens, also habe ich diese gelöscht.

Verwandte Themen