2012-01-08 2 views
0

Easy один я думаю/надеюсь, ... У меня есть запрос, который возвращает список из 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 :: Отношение класс):

[#<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 относится к (в том же порядке)?

Спасибо!

ответ

1

у вас есть два варианта для сохранения порядка. Сначала - нетерпеливые пользователи загрузки в исходном запросе. В этом случае

users = @results.map(&:user) 

Второй - изменить порядок на рубиновой стороне

idx = User.find(@results.map(&:user_id)).index_by(&:id) 
users = @result.map{|r| idx[r.use_id]} 
+0

yep - обе эти работы - второе решение немного быстрее кажется. спасибо – user1051849

+0

Если вы правильно загружаете загрузку, нужно быть быстрее – UncleGene

0

Hej, Прежде всего, вам нужно подготовить массив user_ids. он должен выглядеть следующим образом [209, 902, ..., 890] (вы можете использовать карту или собирать метод, чтобы сделать это), то просто построить SQL запрос так:

User.where(:id=>user_ids) 

где user_ids является подготовленный массив

+0

Это не будет сохранять порядок хотя. –

+0

привет там - проблема в том, что порядок исходного массива потерян (он реорганизует результаты на основе идентификатора пользователя ...) – user1051849

+0

tou может включать объекты пользователей в ваш запрос ... http: //m.onkey .org/active-record-query-interface – codevoice

0

User.find(@results.map(&:user_id))

+0

Downvote why? Я считаю, что это правильный ответ. – cvshepherd

+0

привет там. спасибо за это: у меня была быстрая попытка, и она возвращает ошибку - поэтому я преобразовал @ results.to_a, а затем не возвращает никаких результатов. – user1051849

+0

@ user1051849 Странно. Я уверен, что это должно сработать. так как я часто использую эту технику. Вглядываясь в него. – cvshepherd

1

Как насчет:

users = @results.collect(&:user) 
+0

Без нетерпеливой нагрузки на исходный запрос это приведет к N запросам – UncleGene

+0

yep - это работает, но оно выдает нагрузку (20) запросов – user1051849

+0

users = @ results.includes (: user) .collect (&: user) – JBlake

Смежные вопросы