Postgres - 每天一次随机化结果

时间:2013-06-07 15:45:55

标签: ruby-on-rails postgresql activerecord random e-commerce

我正在建立一个商店,想要随机化产品页面,但每天只更改一次。

我知道带有种子编号的随机数发生器可以返回一致的结果,所以也许使用当前日作为种子会起作用。

缓存也可以,或将结果存储在表格中。

这样做的好方法是什么?

3 个答案:

答案 0 :(得分:2)

创建materialized view。这只是当前PostgreSQL中的另一个表,更新了查询结果。我可能会安装一个触发重新填充的cron作业。你可以拥有任何数量的缓存。

The upcoming Postgres 9.3 will have a new feature.
更多关于materialized views in the Postgres wiki

对于快速抽取随机行的方法,您可能会对此相关问题感兴趣:
Best way to select random rows PostgreSQL

答案 1 :(得分:1)

您肯定想要缓存结果。随机排序很慢(特别是在大型数据集中)。您可以拥有一个每晚运行的cron作业,以清除旧缓存并选择新的随机产品。如果您可以将其关闭,那么页面缓存最好,但片段缓存也可以正常工作。

答案 2 :(得分:0)

我找到了一种不同的方法来实现这一点,这也将让我使用will_paginate gem并在产品更新时获得新的信息。

我在表中添加了一个sort_order长整数。然后,每天一次,我将运行查询以使用随机数更新该字段。我会对那个领域进行排序。

概念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