计算给定列的值的总和

9 浏览
0 Comments

计算给定列的值的总和

rails 3.2

Invoice.sum(:amount)

准确地返回amount列中所有值的总和。

如果我执行以下操作:

invoices = Invoice.all

然后:

invoices.sum(:amount)

我会得到以下错误:

NoMethodError: undefined method `+'

有没有办法解决这个问题?

0
0 Comments

原因:问题的原因是因为使用了错误的语法,混淆了ActiveRecord和普通Ruby的用法。

解决方法:使用正确的语法来计算给定列的值的总和。

计算给定列的值的总和是一个常见的需求。在Ruby中,我们可以使用map函数来实现这个目标。例如,下面的代码可以计算一个名为invoices的数组中amount列的总和:

invoices.map(&:amount).sum

然而,上面的代码实际上是两次迭代同一个数组,这样的效率并不高。虽然它可以工作,但它并没有解决最初的问题,也就是为什么invoices.sum(:amount)不起作用。原因是问题的提问者混淆了ActiveRecord和普通Ruby的用法。

要解决这个问题,我们需要使用正确的语法。在ActiveRecord中,我们可以使用以下代码来计算给定列的值的总和:

invoices.sum(:amount)

这将在数据库层面执行计算,而不是在Ruby层面进行迭代。这种方法更加高效,并且符合问题的需求。

另外,如果我们想计算两列的总和,比如amount和fees列,我们可以使用类似的语法。例如:

invoices.sum(:amount) + invoices.sum(:fees)

这将计算出amount和fees列的总和,并将它们相加得到最终的结果。

总之,正确使用ActiveRecord的语法可以更高效地计算给定列的值的总和。避免混淆ActiveRecord和普通Ruby的用法可以避免出现类似问题,并且可以更好地满足需求。

0
0 Comments

问题出现的原因是:如果给定的列中存在空值(nil),那么使用invoices.map(&:amount).compact.suminvoices.sum { |i| i.amount || 0 }会导致NoMethodError: undefined method '+' for nil错误。

解决方法是:如果确定给定的列中没有空值,那么尝试的方法应该是有效的。但如果列中存在空值,可以使用invoices.map(&:amount).compact.suminvoices.sum { |i| i.amount || 0 }来解决该问题。

0
0 Comments

计算给定列的值的总和是一个常见的问题,通常在使用ActiveRecord进行数据库查询时会遇到。这个问题的出现是因为在ActiveRecord中,有一个名为#sum的方法可以直接计算数据库中某一列的值的总和。这个方法会将聚合操作直接构建到数据库查询中,类似于SQL中的语句SELECT SUM(name_of_column_to_sum) FROM table_name;

然而,如果想要将这些值返回并存储在一个变量中,那么需要使用#all方法获取所有的行数据,再对它们进行求和操作。但是,此时我们已经不再使用ActiveRecord查询,而是使用了一个类似数组的对象,称为ActiveRecord关系(ActiveRecord relation)。因此,在这种情况下,需要使用纯Ruby代码来进行求和操作。可以使用#map方法和#sum方法进行求和,但使用#inject方法会更快更简洁,示例如下:invoices.inject(0){ |sum, invoice| sum + invoice.amount }

使用这种方法可以避免N+1查询的问题。避免在内存中加载不必要的数据是一个好的原则。在这种情况下,使用.sum方法比使用.inject方法更为高效,因为.all方法会将所有的ActiveRecord对象加载到内存中,而我们只需要计算一个值。如果想要了解更多关于这个问题的信息,可以参考这篇文章:https://stackoverflow.com/questions/41449617

总之,计算给定列的值的总和是一个常见的问题,可以使用ActiveRecord的#sum方法直接在数据库中进行计算,也可以使用纯Ruby代码对返回的数据进行求和。根据具体的使用情况选择适合的方法来避免不必要的内存加载。

0