ruby rails - получение коллекции объектов из коллекции внешних ключей
Легко, я думаю / надеюсь... У меня есть запрос, который возвращает список из 20 уникальных внешних ключей:
@results = Report.select("distinct user_id").where("datetime_utc >= ? AND datetime_utc <= ?",@utc_time_slot , @utc_time_slot_end).order("score DESC, quality DESC").limit(20)
это возвращает массив (класс ActiveRecord::Relation):
[#<Report user_id: 803>, #<Report user_id: 809>, #<Report user_id: 806>, #<Report user_id: 801>, #<Report user_id: 830>, #<Report user_id: 860>, #<Report user_id: 858>, #<Report user_id: 856>, #<Report user_id: 854>, #<Report user_id: 852>, #<Report user_id: 851>, #<Report user_id: 850>, #<Report user_id: 849>, #<Report user_id: 846>, #<Report user_id: 859>, #<Report user_id: 866>, #<Report user_id: 2022>, #<Report user_id: 863>, #<Report user_id: 862>, #<Report user_id: 838>]
Что мне нужно сделать с этим массивом @results, чтобы извлечь коллекцию пользователей из таблицы пользователей, на которую ссылается список user_id (в том же порядке)?
Спасибо!
4 ответа
Решение
У вас есть два варианта сохранения заказа. Во-первых - загружать пользователей в исходный запрос. В этом случае
users = @results.map(&:user)
Второе - переупорядочить на рубиновой стороне
idx = User.find(@results.map(&:user_id)).index_by(&:id)
users = @result.map{|r| idx[r.use_id]}
Хей, в первую очередь нужно подготовить массив user_ids. он должен выглядеть следующим образом [209, 902, ..., 890] (для этого можно использовать метод map или collect), а затем просто построить запрос sql следующим образом:
User.where(:id=>user_ids)
где user_ids подготовлен массив