Если вы используете postgresql, mssql или oracle, вы можете использовать функцию row_number (), но, похоже, вам понадобятся два вложенных запроса, которые могут быть более сложными, чем вы хотите.См. Возвращение строки каждой n-й записи для примера того, как ее построить.
Оттуда то, что вы пытаетесь сделать, может выглядеть так:
MyModel.find_by_sql("
select * from my_models where id in (
SELECT t.id
FROM
(
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rownum
FROM my_models
WHERE [YOUR CONDITIONS HERE]
) AS t
WHERE t.rownum % n = 0
ORDER BY t.key
)")
Отсюда трудно сказать, насколько дорогим может быть этот запрос.Если бы я мог дать какой-то совет, я бы действительно предложил доказать, что у вас есть проблема с производительностью, делая это Rails, прежде чем пытаться выполнить оптимизацию, подобную этой.
Вы можете избежать необходимости извлекать и десериализовать все записивы бы пропустили, используя метод ids объекта запроса AREL , чтобы получить только идентификаторы, подобные следующим:
class MyModel < ActiveRecord::Base
class < self
def get_each_n_of_query(n)
all_ids = get_query.ids
ids = (0... all_ids.length).select{ |x| x%n == n-1 }.map { |y| all_ids[y] }
where(id: ids)
end
def get_query()
where(foo: 'bar', ...)
end
end
end
Кредит на ответы на Как выбратькаждый n-й элемент в массиве? о том, как разделить список идентификаторов.