Я хотел бы сделать запрос, где я выбираю набор данных, но я хотел бы смочь затем уменьшить разрешение тех данных, только выбирая, скажем, каждую третью запись или возможно даже каждую сотую запись, или что бы то ни было.
Там какой-либо простой путь состоит в том, чтобы сделать это с ActiveRecord?
В 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")
должно сработать.
Если ваша модель имеет восходящую строку, например id
, без пропуска какого-либо числа, вы можете сделать что-то вроде этого :
Model.all(:condition => "models.id%3=0")
Если нет, вы можете сначала получить все строки из базы данных, а затем сделать это:
models = Model.all
third_models = models.reject{ |model| models.index(model) % 3 != 0 }