2014-07-23 99 views
3

我有一個簡單的ActiveRecord的查詢,看起來像on Rails的4應用程序在我的紅寶石如下:Ruby on Rails的關鍵ActiveRecord的結果集到哈希

ps = PlayerSalary.where(gamedate: date, site_id: site.id).find_all_by_player_id(player_ids) 

我的問題如下。在ps集可以在任何時候都有幾百記錄,通常可達300我希望能夠能夠從它訪問記錄時遍歷player_ids像下面我:

player_ids.each do |pid| 
    # retrieve record from `ps` where ps.player_id == pid 
end 

的最快的方法是組織由密鑰設置的ps,其中密鑰爲player_id。從ps創建散列的最佳方法是什麼?

回答

2

只需打開名冊,並創建一個映射:

ps_map = {} 
ps.each do |p| 
    ps_map[p.player_id] = p 
end 
2

在一個行:

ps.each_with_object({}) { |r, h| h[r.id] = r }

1

烏里阿加西(修訂版)的答案應該工作。這將以我喜歡的方式得到相同的結果。

Hash[ ps.map{ |p| [p.player_id, p] } ] 
1

紅寶石2.1+

ps_ids_hash = ps.map{ |c| [c.name,c.code] }.to_h 

紅寶石1.8.7+

ps_ids_hash = Hash[ ps.map{ |c| [c.name,c.code] } ] 

紅寶石1.8.6+

ps_ids_hash = Hash[ *ps.map{ |p| [p.id,p] }.flatten ] 

紅寶石1.9+

ps_ids_hash = {}.tap{ |h| ps.each{ |p| h[p.id] = p } } 

紅寶石1.9+

ps_ids_hash = ps.to_a.each_with_object({}){ |p,h| h[p.id] = p } 

紅寶石1.8+

ps_ids_hash = ps.inject({}){ |r,p| r.merge p.id => p } 
+0

在Rails 4,你可以做一些服務你的目的 哈希[* ps.pluck(:ID),* PS] –