2012-01-08 75 views
0

輕鬆一我想/希望......我有一個返回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 2012-01-08 20:08:49

+0

如果你急於加載正確的第一個應該更快 – UncleGene 2012-01-09 01:10:17

0

Hej, 首先您需要準備user_ids數組。它應該是這樣的[209,902,...,890](你可以使用地圖或收集方法,這樣做),那麼只建立SQL查詢這樣的:

User.where(:id=>user_ids) 

其中user_ids準備陣列

+0

這雖然不會保存排序。 – 2012-01-08 16:24:14

+0

嗨那裏 - 問題是,原始數組的順序丟失(它重新排列基於用戶ID的結果...) – user1051849 2012-01-08 16:28:21

+0

tou可以包含用戶對象到您的查詢... http://m.onkey .org/active-record-query-interface – codevoice 2012-01-08 18:09:09

0

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

+0

Downvote爲什麼?我相信這是一個有效的答案。 – cvshepherd 2012-01-08 18:13:09

+0

你好。感謝這一點:我有一個快速嘗試,它會返回一個錯誤 - 所以我轉換@ results.to_a,然後它不返回結果。 – user1051849 2012-01-08 18:31:00

+0

@ user1051849奇怪。我很確定這應該起作用。因爲我經常使用這種技術。看着它。 – cvshepherd 2012-01-08 18:34:25

1

如何:

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

如果沒有急於加載原始查詢,它會導致N查詢 – UncleGene 2012-01-08 18:31:57

+0

是 - 這是行得通的,但它踢出了查詢的負載(20) – user1051849 2012-01-08 18:51:39

+0

users = @ results.includes(:user).collect(&:user) – JBlake 2013-12-14 23:46:20