我正在建立一家商店,想随机化一个产品页面,但每天只更改一次。
我知道带有种子编号的随机发生器可以返回一致的结果,因此也许使用当天作为种子会起作用。
缓存也可以工作,或者将结果存储在表中。
什么是这样做的好方法?
我正在建立一家商店,想随机化一个产品页面,但每天只更改一次。
我知道带有种子编号的随机发生器可以返回一致的结果,因此也许使用当天作为种子会起作用。
缓存也可以工作,或者将结果存储在表中。
什么是这样做的好方法?
创建物化视图。这只是当前 PostgreSQL 中的另一个表,使用查询结果进行了更新。我可能会安装一个触发重新填充的 cron 作业。除此之外,您可以拥有任意数量的缓存。
即将推出的 Postgres 9.3 将有一个新功能。
更多关于Postgres wiki 中的物化视图。
对于拉随机行的快速方法,您可能对这个相关问题感兴趣:
Best way to select random rows PostgreSQL
你肯定想缓存结果。随机排序很慢(尤其是在大型数据集中)。你可以有一个每天晚上运行的 cron 作业来清除旧缓存并选择新的随机产品。如果您可以将其关闭,则页面缓存是最好的,但片段缓存也可以正常工作。
我找到了一种不同的方法来实现这一点,这也可以让我使用 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