2012-01-08 78 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