1

ストアを構築していて、製品ページをランダム化したいと考えていますが、変更するのは 1 日に 1 回だけです。

シード番号を持つランダマイザーが一貫した結果を返すことができることを知っているので、おそらく現在の日をシードとして使用するとうまくいくでしょう。

キャッシュ、または結果をテーブルに保存することもできます。

これを行うにはどうすればよいでしょうか。

4

3 に答える 3

2

マテリアライズド ビューを作成します。これは、クエリの結果で更新された、現在の PostgreSQL の単なる別のテーブルです。リフィルをトリガーするcronジョブをインストールする場合があります。その上に任意の量のキャッシングを行うことができます。

次の Postgres 9.3 には新しい機能があります。Postgres wiki の
具体化されたビューの詳細。

ランダムな行をすばやくプルする方法については、次の関連する質問に興味があるかもしれません:
Best way to select random rows PostgreSQL

于 2013-06-07T15:59:54.563 に答える
1

間違いなく結果をキャッシュする必要があります。物事をランダムに並べ替えるのは遅いです (特に大規模なデータセットでは)。古いキャッシュをクリアし、新しいランダムな製品を選択するために、毎晩実行される cron ジョブを持つことができます。それができるならページ キャッシュが最適ですが、フラグメント キャッシュでも問題なく動作します。

于 2013-06-07T15:54:04.103 に答える
0

これを達成するための別の方法を見つけました。これにより、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
于 2013-06-07T16:53:10.227 に答える