ストアを構築していて、製品ページをランダム化したいと考えていますが、変更するのは 1 日に 1 回だけです。
シード番号を持つランダマイザーが一貫した結果を返すことができることを知っているので、おそらく現在の日をシードとして使用するとうまくいくでしょう。
キャッシュ、または結果をテーブルに保存することもできます。
これを行うにはどうすればよいでしょうか。
ストアを構築していて、製品ページをランダム化したいと考えていますが、変更するのは 1 日に 1 回だけです。
シード番号を持つランダマイザーが一貫した結果を返すことができることを知っているので、おそらく現在の日をシードとして使用するとうまくいくでしょう。
キャッシュ、または結果をテーブルに保存することもできます。
これを行うにはどうすればよいでしょうか。
マテリアライズド ビューを作成します。これは、クエリの結果で更新された、現在の PostgreSQL の単なる別のテーブルです。リフィルをトリガーするcronジョブをインストールする場合があります。その上に任意の量のキャッシングを行うことができます。
次の Postgres 9.3 には新しい機能があります。Postgres wiki の
具体化されたビューの詳細。
ランダムな行をすばやくプルする方法については、次の関連する質問に興味があるかもしれません:
Best way to select random rows PostgreSQL
間違いなく結果をキャッシュする必要があります。物事をランダムに並べ替えるのは遅いです (特に大規模なデータセットでは)。古いキャッシュをクリアし、新しいランダムな製品を選択するために、毎晩実行される cron ジョブを持つことができます。それができるならページ キャッシュが最適ですが、フラグメント キャッシュでも問題なく動作します。
これを達成するための別の方法を見つけました。これにより、will_paginate gem を使用して、製品が更新されたときに最新の情報を入手することもできます。
sort_order
テーブルに長整数を追加しました。次に、1 日 1 回クエリを実行して、そのフィールドを乱数で更新します。そのフィールドを並べ替えます。
概念的な Rails コード:
# Pulling in the products in the specified random order
def show
@category = Category.where(slug: params[:id].to_s).first
if @category
@random_products = @category.products.order(sort_order: :desc) # desc so new products are at the end
end
end
# Elsewhere...
def update_product_order
products = Product.order("RANDOM()").all
order_index = 0
products.each do |p|
product.sort_order = order_index
product.save! # this can be done much more efficiently, obviously
order_index += 1
end
end