我很想/希望...我有一个查询返回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 class):
[#<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列表引用的users表中提取用户集合(按相同顺序)?
谢谢!
答案 0 :(得分:1)
怎么样:
users = @results.collect(&:user)
答案 1 :(得分:1)
您有两种保留订单的选项。首先 - 急切地在原始查询中加载用户。在这种情况下
users = @results.map(&:user)
第二 - 重新订购红宝石面
idx = User.find(@results.map(&:user_id)).index_by(&:id)
users = @result.map{|r| idx[r.use_id]}
答案 2 :(得分:0)
HeJ小鼠, 首先,您需要准备user_ids数组。它应该看起来像这样[209,902,...,890](你可以使用map或collect方法来做到这一点)然后只需构建sql查询:
User.where(:id=>user_ids)
其中user_ids已准备好数组
答案 3 :(得分:0)
User.find(@results.map(&:user_id))