2010-09-28 4 views
4

Cela me semble très étrange, une somme record actif retourne une chaîne, pas un nombreactiveecord sum renvoie une chaîne?

basket_items.sum("price") 

Cela semble le faire fonctionner, mais je pensais que je peut-être manqué quelque chose, comme cela semble être un comportement très étrange .

basket_items.sum("price").to_i 

Répondre

2

https://github.com/rails/rails/pull/7439

Il y avait une raison pour laquelle il est retourné une chaîne - appelant to_d sur un Fixnum en Ruby 1.8 donnerait un NoMethodError. Ce n'est plus le cas dans Ruby 1.9, donc il est probablement correct de changer.

2

Selon les (rails 2.3.9) API:

La valeur est retournée avec le même type de données de la colonne, 0 s'il n'y a pas de ligne

pourrait votre price colonne être un string ou text?

+0

Il est possible que la base de données soit sqlite3, auquel cas tout est stocké sous forme de chaîne pouvant causer le problème. Je ne rencontre pas le problème sur mysql mais n'ai pas de sqlite3 à tester pour le moment. – Shadwell

+0

En utilisant mysql, et ma colonne de prix est un flottant, en utilisant Rails 2.3.9 – pingu

0

somme ActiveRecord:

Différence:

1) basket_items.sum ("prix")

Il résumera aussi entier non également et il retournera entier non type.

2) basket_items.sum ("prix"). To_i

Ce ci-dessus convertir en entier.

# File activerecord/lib/active_record/relation/calculations.rb, line 92 
def sum(*args) 
    if block_given? 
    self.to_a.sum(*args) {|*block_args| yield(*block_args)} 
    else 
    calculate(:sum, *args) 
    end 
end 

calcule la somme des valeurs dans une colonne donnée. La valeur est renvoyée avec le même type de données de la colonne, 0 s'il n'y a pas de ligne.

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-sum

Github:

https://github.com/rails/rails/blob/f8f4ac91203506c94d547ee0ef530bd60faf97ed/activerecord/lib/active_record/relation/calculations.rb#L92

Voir aussi, Advanced sum() usage in Rails.

Questions connexes