2014-05-06 72 views
-2
> Player.joins(:game).order('games.scheduled_start ASC').last(5).sum(:ppg) 

=> NoMethodError: undefined method `+' for #<GamePlayer:0x007ff543cd05d8> 


> Player.joins(:game).order('games.scheduled_start ASC').sum(:ppg) 

=> #<BigDecimal:7ff543cebc20,'0.30115E3',18(18)> 

所以,我不明白爲什麼.last(n)是打破我打電話.average.sum在這個集合的能力。紅寶石平均和去年(N)

編輯

[19] pry(main)> GamePlayer.order('id desc').limit(10).map{|x| x.ppg.to_f} 
    GamePlayer Load (0.6ms) SELECT "game_players".* FROM "game_players" ORDER BY id desc LIMIT 10 
=> [14.0, 0.75, 1.2, 0.0, 2.55, 1.19, 2.04, 2.0, 0.0, 24.68] 

[20] pry(main)> GamePlayer.order('id desc').limit(10).average(:ppg).to_f 
    (74.4ms) SELECT AVG("game_players"."ppg") AS avg_id FROM "game_players" LIMIT 10 
=> 8.943831900603671 

[21] pry(main)> GamePlayer.order('id desc').limit(50).average(:ppg).to_f 
    (73.4ms) SELECT AVG("game_players"."ppg") AS avg_id FROM "game_players" LIMIT 50 
=> 8.943831900603671 

[22] pry(main)> GamePlayer.order('id desc').limit(50).map{|x| x.ppg.to_f}.sum/50 
    GamePlayer Load (0.9ms) SELECT "game_players".* FROM "game_players" ORDER BY id desc LIMIT 50 
=> 3.649800000000001 

任何人都有一個想法是什麼這種差異是什麼?

回答

4

last(5)(或更一般last(n))是Array,所定義的方法,這意味着ActiveRecord::Relation你已經通過調用Player.joins(:game).order('games.scheduled_start ASC')將被評估,以陣列建立,然後將last(5)該所得陣列上被調用。

Rails添加調用sum陣列上的能力,但它的工作不同於上一個ActiveRecord::Relation(通過調用每一個對象和電流總和,從0+)。

相反,你可能會想要使用此:

players = Player.joins(:game).order('games.scheduled_start DESC').limit(5) 
sum = Player.joins(:game).where(id: players).sum(:ppg) 

請注意,我從切換到ASCDESC,因爲限制總是會從一開始元素。現在sum實際上將被轉換爲相應的SQL聚合函數,它將在:ppg列上工作。 where-clause用於觸發子查詢,以確保sum將 只適用於limit所選的玩家。

不過,若你真的想用一個陣列的工作(這會慢一些),你可以使用這個方法:

players = Player.joins(:game).order('games.scheduled_start ASC').last(5) 
# builds the sum of all ppg-values of all players selected 
sum = players.sum(&:ppg) 

average只能在一個ActiveRecord::Relation工作,因爲它沒有在 定義Array(甚至不在Rails中)。當然,您可以自己構建它,但同樣,方法會更快。

+0

我不認爲你可以使用'limit'和'sum'這種方式 – Stefan

+1

如果我沒有弄錯,'SUM'返回一行,'LIMIT'沒有任何作用。 – Stefan

+0

它工作得很好......一旦我有一個關係對象,調用'平均(:ppg)'工作得很好。 – Dudo