2014-06-27 31 views
2

我有一個模型,有一個實例方法point_differential的團隊(基本上指向 - 點對)。我試圖在chartkick圖中使用它,但沒有運氣。在rails應用程序中使用chartkick的實例方法

這工作

= bar_chart Team.group(:組)的.sum(points_for)

因爲points_for只是隊模型的屬性。

這不因爲point_differential是一個實例方法,而不是一個屬性

= bar_chart Team.group(:名稱)的.sum(point_differential)

既不確實

= bar_chart Team.group(:name).sum(&:point_differential)

也不對

bar_chart = Team.all.map {|團隊| {name:team.name,point_differential: team.point_differential}}

任何想法?

回答

4

你最後的選擇幾乎是正確的,但你有錯誤的格式。

考慮您的第一個例子:

Team.group(:group).sum(:points_for) 

這將創建類似下面的哈希:

{"Team A" => 14, "Team B" => 9} 

在你這樣做你的最後一個例子:

Team.all.map {|team| {name:team.name, point_differential: team.point_differential}} 

這將創建哈希數組如下所示:

[{:name => "Team A", :point_differential => 14}, {:name => "Team B", :point_differential => 9}] 

相反,試試這個:

Hash[ *Team.all.map { |team| [team.name, team.point_differential] }.flatten ] 

這是一個深奧的一個內襯採用陣列(每個2元)的陣列,並創建一個哈希了他們,給你這樣的事情:

{"Team A" => 14, "Team B" => 9 } 

就像你想要的。

的另一種方式,表現出更多的步驟來做到這一點,是這樣的:

hash = {} 
Team.all.each do |team| 
    hash[team.name] = team.point_differential 
end 

然後是hash將有正確的價值觀。

+0

謝謝!這是我一旦注意到哈希數組的事情的確切路線。我們在同一時間發佈。謝謝你的單線! – lemonginger

+0

哈沒問題!你絕對應該用你所建議的方法來包裝它。但是,如果我可以提出建議,請不要將此方法放在您的某個模型上,因爲它對您使用的寶石非常具體。如果以後使用不同的寶石會需要不同的結構?考慮像ChartHelper.player_point_differentials這樣的自定義類/方法或將其放入幫助程序中。 – MrDanA

1

我解決了這個寫一個類的方法採用注射建立一個哈希

def self.hashify_points_differential 
    Player.all.inject({}) do |result, player| 
    result[player.name] = player.point_differential 
    result 
    end 
end 

然後我就可以使用它像

= bar_chart Player.hashify_points_differential 
相關問題