簡體   English   中英

Rails:“緩存”關聯模型值的平均值

[英]Rails: “Caching” the average of an associated model's values

在Rails中,我有一些看起來像這樣的模型:

class Product
  has_many :listings
end

class Listing
  belongs_to :product
  # quantity_in_kg
  # total_price
  # price_per_kg = total_price / quantity_in_kg
end

我希望能夠根據產品的每公斤價格與產品的每公斤價格進行比較。 例如,此清單的價格僅為每公斤2美元,而產品的平均價格為3美元。

最終,我希望能夠運行一個查詢,說“給我所有低於其產品平均價格的商品”。

有效的方法是什么? 我正在考慮使用ActiveRecord回調進行自定義,並在products表中緩存每千平均價格,並在listings表中緩存每個列表的每千價格。 可能有很多問題可以解決,所以我想知道是否還有另一種方法。

我正在使用Postgres 9.6和Rails 5.1.0。

(加分點:列表也可以是活躍/不活躍的,我只想比較所有活躍列表的平均值)。

我的建議是從一個簡單的after_save回調開始,看看它將帶您到哪里。 您可以添加一些更新條件,例如“僅在創建/銷毀時重新計算,或者如果active已被更新”,如果您格外小心,則添加一些事務等。

如果太慢,請添加后台工作人員定期進行更新(例如)。

class Listing
  after_save do
    product.update(
      avg_price_per_kg: product.listings.where(active: true).average(:price_per_kg)
    )
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM