ActiveRecord находят - пропускающие записи или получение каждой энной записи

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

Там какой-либо простой путь состоит в том, чтобы сделать это с ActiveRecord?

6
задан Colin Ramsay 30 June 2010 в 08:20
поделиться

2 ответа

В Oracle я бы написал это следующим образом:

YourModel.find(:conditions => 'MOD(ROWNUM,3) = 0') 

это имеет то преимущество, что фильтр применяется в базе данных, поэтому не все извлекается.

В PostgreSQL это называется ROW_NUMBER (на самом деле это стандарт SQL). В MySQL это не поддерживается.

В mysql вы можете имитировать rownum, используя SELECT @rownum: = @ rownum + 1 rownum, t. * FROM (SELECT @rownum: = 0) r, mytable t; . Думаю, что-то вроде

Bar.find_by_sql("select * from (SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, mytable t) where mod(rownum,3) = 0") 

должно сработать.

1
ответ дан 17 December 2019 в 02:21
поделиться

Если ваша модель имеет восходящую строку, например id , без пропуска какого-либо числа, вы можете сделать что-то вроде этого :

Model.all(:condition => "models.id%3=0")

Если нет, вы можете сначала получить все строки из базы данных, а затем сделать это:

models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }
5
ответ дан 17 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: