Возврат каждой n-й строки из базы данных с использованием ActiveRecord в rails - PullRequest
6 голосов
/ 24 ноября 2011

Ruby 1.9.2 / rails 3.1 / развернуть на heroku -> posgresql

Привет, Как только количество строк, относящихся к объекту, превышает определенное количество, я хочу вместо этого откатить каждую n-ю строку,Это просто потому, что строки используются (частично) для отображения данных для построения графиков, поэтому, как только число возвращаемых строк становится больше, скажем, 20, хорошо возвращать каждую вторую и т. Д.

Этот вопрос казалсячтобы указать в правильном направлении: Поиск ActiveRecord - Пропуск записей или получение каждой N-й записи

Выполнение мода на номер строки имеет смысл, но в основном:

@widgetstats = self.widgetstats.find(:all,:conditions => 'MOD(ROW_NUMBER(),3) = 0 ')

не работает, он возвращает ошибку:

PGError: ERROR:  window function call requires an OVER clause

И любая попытка решить эту проблему, например, основывая мой синтаксис предложения OVER на вещах, которые я вижу в ответе на этот вопрос:

Нумерация строк в PostgreSQL

заканчивается синтаксическими ошибками, и я не могу получить результат.

Мне не хватает более очевидного способа эффективного возврата каждой n-й задачи или еслиЯ на правильном пути, какие-нибудь указатели на пути?Очевидно, что возврат всех данных и последующее их исправление в рельсах возможны, но ужасно неэффективны.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011

Я думаю, что вы ищете такой запрос:

SELECT * FROM (SELECT widgetstats.*, row_number() OVER () AS rownum FROM widgetstats ORDER BY id) stats WHERE mod(rownum,3) = 0

Это сложно построить с помощью ActiveRecord, поэтому вам может потребоваться сделать что-то вроде:

@widgetstats = self.widgetstats.find_by_sql(
  %{
    SELECT * FROM
    (
      SELECT widgetstats.*, row_number() OVER () AS rownum FROM widgetstats ORDER BY id
    ) AS stats
    WHERE mod(rownum,3) = 0
  }
)

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

2 голосов
/ 24 ноября 2011

Если бы я решил это, я бы либо сам написал SQL, например, тот SQL, с которым вы связались. Вы можете сделать это с

my_model.connection.execute('...')

или просто получите идентификационные номера и найдите по id

ids = (1..30).step(2)
my_model.where(id => ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...