2013-06-07 4 views
0

Я создаю магазин и хотел бы рандомизировать страницу продукта, но только менял его один раз в день.Postgres - рандомизировать результаты один раз в день

Я знаю, что рандомизатор с номером семени может возвращать согласованные результаты, поэтому, возможно, используя текущий день, поскольку семя будет работать.

Кэширование также будет работать или хранить результаты в таблице.

Что было бы хорошим способом сделать это?

ответ

0

я нашел другой способ сделать это, что также позволит мне использовать will_paginate камень и иметь свежую информацию когда продукты обновляются.

Я добавил длинное целое число sort_order в таблицу. Затем один раз в день я запускаю запрос, чтобы обновить это поле со случайными числами. Я сортирую это поле.

Концептуальные Рельсы Код:

# 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 
+1

Если ваш стол служит не только для этой цели, возможно, лучше иметь отдельную маленькую таблицу 'random_picks', содержащую только выбранные идентификаторы pk. Присоедините это к большой таблице в своем запросе. Это немного медленнее, чем наличие колонки в самой таблице, но все же очень быстро. Вам нужно установить * index * в любом случае. Добавление столбца для специального назначения добавляет (небольшую) стоимость для каждой операции в большой таблице, а обновление большой строки означает запись новой строки каждый раз. Также чище и привилегии легче разделить. –

+0

Кроме того, будьте осторожны при выполнении RAND(), так как он может быть ОЧЕНЬ медленным, так как db становится большим. Дополнительная информация: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/ Я не знаю, т. е. ваше решение будет хорошо масштабироваться, но, вероятно, не очень важно, если вы используете его только как рейк-задачу, а не через Интернет. – Josh

+0

Спасибо, ребята. Я очень хорошо знаю последствия этого, поэтому, если сайт станет большим, я добавлю некоторые улучшения, такие как отдельная таблица индексов, и, возможно, один запрос для обновления всех заказов сортировки сразу (не сложно). На данный момент это работает. :) –

1

Вы определенно хотите кэшировать результаты. Сортировка вещей случайным образом медленная (особенно в больших наборах данных). У вас может быть задание cron, которое запускается каждую ночь, чтобы очистить старый кеш и выбрать новые случайные продукты. Кэш страниц лучше всего, если вы можете снять это, но кеш-фрагмент будет работать отлично.

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

+0

Я ценю информацию - хороший материал! Вероятно, сейчас я просто сделаю кеш Rails, но могу перейти к материализованному представлению, если сайт станет достаточно популярным, чтобы гарантировать его. –

+0

На самом деле, я понял, что кеширование не будет работать, так как я хочу использовать жемчужину will_paginate. Однако я нашел способ. Я поставлю его здесь. –

Смежные вопросы