Rails Active Record - получает равномерно распределенное произвольное количество записей - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу иметь запросы в моем приложении rails, которые возвращают равномерно распределенное произвольное количество записей.

Что означает, что если мой запрос возвращает 100 записей, а я хочу только 4, он должен вернуть записи 100, 75, 50 и 25. Если я хочу 5, он должен вернуть 100, 80, 60, 40, 20.

Я знаю, что мог бы сделать это, манипулируя массивом после результата, но мой вопрос, есть ли способ сделать это напрямую с ActiveRecord или даже с SQL?

1 Ответ

0 голосов
/ 11 сентября 2018

Если вы используете 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-й элемент в массиве? о том, как разделить список идентификаторов.

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