我正在建立一个商店,想要随机化产品页面,但每天只更改一次。
我知道带有种子编号的随机数发生器可以返回一致的结果,所以也许使用当前日作为种子会起作用。
缓存也可以,或将结果存储在表格中。
这样做的好方法是什么?
答案 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