Czy wy też macie czasem problem z poprawnym działaniem metody sum?
#v = transfers_between(start_day , end_day).sum {|t| t.value_by_category(self)}
tt = transfers_between(start_day , end_day)
sum = 0
tt.each do |t|
sum += t.value_by_category(self)
end
v = sum
Pierwsza linijka nie działa (dlatego jest zakomentowana) i muszę używać tych kilku, które napisałem niżej.
Jakiś pomysł czego to może być przyczyna?
Właściwie nie wiadomo, co jest w transfers_between(start_day, end_day).
Są dwie metody sum. Jedna dla typu Enumerable, druga dla typu ActiveRecord. Pierwsza robi dokładnie to, co wkleił jszumiec, a druga, z tego co pamiętam, wywołuje zapytanie SQL-owe z SUM() dla danego pola.
Category.find(4).transfers_between().sum { |t| t.value_by_category( Category.find(4) ) }
ArgumentError: wrong number of arguments (1 for 2)
from …/activerecord-1.15.2/lib/active_record/associations/has_many_through_association.rb:110:in calculate' from .../activerecord-1.15.2/lib/active_record/associations/has_many_through_association.rb:110:in method_missing’
from …/activerecord-1.15.2/lib/active_record/base.rb:946:in with_scope' from .../activerecord-1.15.2/lib/active_record/associations/has_many_through_association.rb:110:in method_missing’
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/associations/has_many_through_association.rb:102:in `sum’
from (irb):23
from :0
Rzucając okiem na has_many_through_association.rb:102 widzimy, że wywoływane jest sum od ActiveRecorda, a nie sum od Enumerable. Ponieważ jest to has_many, jest ono nadpisywane przez ActiveRecorda, który chce wywoływać SQL-a.
Metoda to_a tworzy Array z danego obiektu. W tym wypadku tworzy Array z Array, z tym że pierwszy Array przez to, iż był utworzony za pomocą has_many miał nadpisaną metodę sum na wywoływanie SQL-a, podczas gdy drugi Array wywołuje już oryginalne sum.
To jest bardzo nieeleganckiego rozwiązanie, i pewnie po tygodniu zapomnisz o co właściwie chodziło. Rekomendowałbym pierwsze.