Vraag sum (&: x) werkt niet meer


ik gebruik payments.sum(&:price) in mijn Rails-app (4.1.2). Sinds ik heb bijgewerkt van Ruby 1.9.3 naar 2.1.2, krijg ik de volgende foutmeldingen:

wrong number of arguments (1 for 2..3)

Deze varianten werken:

payments.map(&:price).sum
payments.to_a.sum(&:price)

Moet ik mijn code herschrijven of mis ik iets? Dank je!


16
2018-06-30 19:44


oorsprong


antwoorden:


Van de documentatie:

sum (* args)

Berekent de som van waarden in een gegeven kolom. De waarde wordt geretourneerd   met hetzelfde gegevenstype van de kolom, 0 als er geen rij is. Zien   bereken voor voorbeelden met opties.

Person.sum(:age) # => 4562

het lijkt erop dat uw code zonder de &:

payments.sum(:price)

18
2018-06-30 19:48



Als u dit in Rails 4.0 had uitgevoerd, zou u de volgende afkeuringswaarschuwing ontvangen:

DEPRECATION WARNING: #sum bellen met een blok is verouderd en zal   worden verwijderd in Rails 4.1. Als u de somberekening wilt uitvoeren   de array van elementen, gebruik 'to_a.sum (& block)'.

Dit verwijst naar de methode Relation#sum die eerder werkte in Rails 3.2 wanneer een blok werd gegeven.

Zoals anderen hebben geantwoord, moet je het gebruiken payments.sum(:price) als prijs een databasekolom is, of gebruik payments.to_a.sum(&:price) als price is een instantiemethode.


4
2018-06-20 20:39



Als betalingen een ActiveRecord-koppeling is, kunt u de ActiveRecord :: Berekening som methode in plaats daarvan:

payments.sum(:price)

2
2018-06-30 19:51



sum terwijl je het gebruikt is een methode aan Enumerable module gedefinieerd door Rails, niet Ruby. Het upgraden van ruby-versies zou geen verschil moeten maken:

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

Als u het echter gebruikt om een ​​kolom op een ActiveRecord op te tellen, raad ik aan dit te gebruiken sum methode op ActiveRecord::Relation. U kunt dit doen door de &, zoals andere antwoorden suggereren.

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

Het verschil is dat de eerste alle records uit de database ophaalt, de objecten maakt, de price methode op hen en somt de resultaten. De laatste maakt een SQL-instructie met SUM, wat veel beter is voor de prestaties.


0
2018-06-30 19:58