ActiveRecord Find - Пропуск записей или получение каждой N-й записи - PullRequest
6 голосов
/ 30 июня 2010

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

Есть ли прямой способ сделать это с ActiveRecord?

Ответы [ 2 ]

5 голосов
/ 30 июня 2010

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

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

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

models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }
1 голос
/ 30 июня 2010

В 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") 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...