Techioz Blog

計算に基づいて ActiveRecord クエリを順序付ける方法

概要

たとえば、販売しているペストリーの数でパン屋をリストしたいと思います。

それらをランク付けするには、各ペストリーの入手可能なペストリーの数に、販売されている割合を掛けたものを合計します。ベーカリーでは 0 ~ 10 個のペストリーを販売する可能性があります。例えば:

bakery1.pastry1 = 100
bakery1.pastry1_discount = 10 (%)
bakery1.pastry2 = 50
bakery1.pastry2_discount = 20 (%)
(2 pastries on sale)

(100 x 10) + (50 x 20) = 2000 .. が最初にリストされます。

bakery2.pastry1 = 10
bakery2.pastry1_discount = 40
bakery2.pastry2 = nil
bakery2.pastry2_discount = nil
(only 1 pastry on sale, etc)

10 x 40 = 400 .. 2 番目に記載

bakery3.pastry1 = 10
bakery3.pastry1_discount = 20
bakery3.pastry2 = nil
bakery3.pastry2_discount = nil

10 x 20 = 200 .. 最後にリストされています

では、特定の属性値の乗算の合計によってベーカリーを注文するにはどうすればよいでしょうか?

これまでのところ、sort_by はデータベースのメモリに負荷がかかることがわかりました。

更新: … (ペストリーの販売 - ペストリーの販売) x 割引になるはずです

解決策

orderの代わりにsort_byを使用し、利用可能なペストリーを計算するインスタンスメソッドを作成しました

class Bakery
 # method to calculate pastery availability
 def pastery_count
   count = 0
   self.pastery.each do |ps|
     count = count + ps.count.to_i * ps.discount.to_i
   end

   count
 end
end

次に、sort_by を使用して呼び出します

Bakery.sort_by{|br| br.pastery_count}

where句と組み合わせることもできます

Bakery.where(...).sort_by{|br| br.pastery_count}