計算に基づいて 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}