Условие поиска в Rails, следуя порядку последовательно генерируемой коллекции - PullRequest
0 голосов
/ 28 марта 2020

Собирается массив идентификаторов

@valid_ts = []
@valid_ts = @valid_ts << dst_1.id 
@valid_ts = @valid_ts << dst_2.id

примечание: каждая строка, показанная выше, фактически выполняется для каждого члена коллекции (т. Е. Dst_1.size> 1)
Когда приходит время запрашивать базу данных

slots = Timeslot.where('id IN (?)', @valid_ts).all

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

Как можно соблюдать исходный порядок массива с помощью Rails?

1 Ответ

1 голос
/ 28 марта 2020

Если вы используете Mysql, вы можете использовать field функцию.

Timeslot.where(id: @valid_ts).order("field(id, #{ids.join ','})")

Если вы используете Postgres, вы можете использовать position функцию. -

Timeslot.where(id: @valid_ts).order("position(id::text in '#{ids.join(',')}')")

Но ActiveRecord может работать для обоих, если вы используете rails >= 5.2.0, как это добавлено из этой версии. Скорее всего, это также перенесено в rails 5.0. запрос на получение и commit и документация .

Timeslot.find(@valid_ts)

Проверьте этот пост SO для получения дополнительных идей. .

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