Есть массив с id: ids = ["4", "1", "3", "2"]
По нему выбираются записи из базы: @users = User.where(id: ids)
Но они достаются в порядке, в котором лежат в базе.
Как сохранить порядок, который передается в where?
Т.е:
# Получаю сейчас
User.where(id: ids) # User1, User2, User3, User4
# Хочу получить
User.where(id: ids) # User4, User1, User3, User2
class Something < ActiveRecrd::Base
scope :for_ids_with_order, ->(ids) {
order = sanitize_sql_array(
["position(id::text in ?)", ids.join(',')]
)
where(:id => ids).order(order)
}
end
# usage:
Something.for_ids_with_order([1, 3, 2])
Нашел такое, вроде, работает. Но может есть лучше способ.
Но это уже использовать нельзя:
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s)
Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes
alfss, вообще есть 2 таблицы: columns и user_settings. В первой id колонок и названия, а во второй id пользователя и столбец params, куда предполагалось складывать пользовательские настройки сортировки по типу {"col_id": 1, "place": 2}, {"col_id": 2, "place": 1}.
Но я не знаю как связать эти таблицы между собой, чтобы можно было достать названия из columns, а сортировку произвести по значению в params.
Вот так получается. Т.е. эти таблицы не связаны столбцами никак. Связано поле params и столбец id в таблице columns. И мне нужно достать сами названия из columns, но отсортировать их по place в params. И каждый пользователь имеет разные params.
Тут не получится так вы хотите, да и в первый раз не получилось бы.
У вас грубо говоря должна быть связь m2m где записи вида
userid 1, colid 1, place 1
userid 1, colid 2, place 2
Если вы можете все же разбить на части по colid то можно сделать order by place, если это postgres , то поле params должно быть Json и там можно извернуться , но индексы там не btree будут, это потом станет проблемой.
Полагаю самым лучшим вариантом будет, создать доп таблицу сортировки и вывода и положить туда данные в плоским виде из params, которые необходимы для сортировки, аналогично как выше был указан пример m2m.
alfss, да, с доп. таблицей проблемы бы не возникло, но я думал, что получится без нее. Я начал искать что-то вроде join или merge Activerecod Relation и Hash-а, но тоже ничего не нашел.
Получается, что такая связь возможна лишь через доп. таблицу и все?