2016-03-19 14 views
1

Kullandığım bir sorguyu (ve temelde ham bir SQL) ActiveRecord yöntemlerini kullanarak bir sorguya dönüştürdüm. Dönüştürmeye çalışmamın nedeni, kapsamları tek tek kullanmam gerektiğidir. Raylar 4 - ActiveRecords yöntemlerini kullanarak sorguya ".find_by_sql" yeniden nasıl yazılır?

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") 
    } 

Nasıl dönüştürmek için tüm bu s, se, bir ActiveRecord sorguya u adlar ve 2 INNER JOIN s?

DÜZENLEME:

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") 

Ama bu böyle sadece çıktıyı verir: denedim ne

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

Soğukta saklama istediğini benziyor

+0

Ne denediniz? AR dokümanı okudun mu? http://guides.rubyonrails.org/active_record_querying.html Birleştirmelere bakın, nerede, sayın, gruplayın. –

+0

Denediğim geçerli sorguyu ekledim .... – user984621

+0

Bu gibi sorgularınız varsa, bunları genellikle en iyi durumda tutmak sql – phoet

cevap

0

teşekkür ederiz son birkaç özniteliği olan User örneğidir. Bu durumda ActiveRecord FROM users'u kullanacak, bu yüzden birleştirme işlemlerinizi biraz tekrar yazmanız gerekiyor. Her şey kolay bir INNER JOIN olduğu için. Bu yüzden bu yapardım: yani ciddi bir güvenlik kusur benziyor çünkü #{status} çıkardı

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") 

. SQL enjeksiyonunu önlemek için where("foo = ?", bar)'u nasıl kullanacağınızı öğrenmelisiniz.

Ayrıca, orijinal SQL'de bile eşleşmeyen bazı eşyalar vardı, bu yüzden bunları temizledim.