Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何合计所有值以进行签出?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何合计所有值以进行签出?

Ruby on rails 如何合计所有值以进行签出?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试用Ruby做一些简单的数学运算 我有一个名为工作交付成本的模型。用户可以将多个作业交付成本添加到签出中 我可以在视图中使用delivery\u cost.quantity*delivery\u cost.cost\u per\u unit合计每个作业的交付成本,但是我希望将所有交付成本的总和添加到最后显示 我开发了这个方法: def calculate_delivery_total(array) array.map(&:cost_per_unit).inject(0,

我正在尝试用Ruby做一些简单的数学运算

我有一个名为
工作交付成本
的模型。用户可以将多个作业交付成本添加到签出中

我可以在视图中使用
delivery\u cost.quantity*delivery\u cost.cost\u per\u unit
合计每个作业的交付成本,但是我希望将所有交付成本的总和添加到最后显示

我开发了这个方法:

def calculate_delivery_total(array)
    array.map(&:cost_per_unit).inject(0, &:+) * array.map(&:quantity).inject(0, &:+)
  end
但这太离谱了。这就是我想要实现的目标:

cost_per_unit    quantity
22                3.00         =    66
18                2           =     36

total = 102   

如果您试图计算每单位*数量的成本总和,则在一次操作中完成所有操作:

 array.reduce(0) { |total, item| total + item.cost_per_unit * item.quantity }

您可以使用以下内容:

array.sum { |item| item.cost_per_unit * item.quantity }

如果您的模型被称为
JobDeliveryCost
,那么下面的代码将在一个查询中完成您的计算,从而保存由于在每一行上循环而产生的
n+1
,以及
ActiveRecord
创建新对象的开销

JobDeliveryCost.sum("cost_per_unit * quantity")

你的问题一点也不清楚,除非你所有的单位都是相同的成本,否则你的数学就错了。@Rahul,我已经做了我想做的数学achieve@CodeGnome在英国,我们用s表示数学。查看我的更新是否带有S,
84*5==102#=>false
。因此,你的数学是错误的,因为你的优先顺序是错误的。下面的答案应该是正确的,但是除非你理解你的计算错误的原因,否则你的会计师和股东会讨厌你。你能解释一下减少和注入之间的区别吗?没有区别。我更喜欢reduce,因为我使用的其他语言中也有reduce。如果这个答案是独立的,那就太好了。如果有人想在诸如irb或OPs数据的REPL中尝试Sean的答案:
class Item
。这看起来不错,但它需要ActiveSupport而不是标准的Ruby。请看。这个问题的标签是RubyonRails,我同意。我没有说这是错的;事实上,我认为你的答案看起来比公认的答案更清晰。我只是向未来的访问者指出,如果没有ActiveSupport,答案是无法验证的——如果没有指出,将答案粘贴到REPL中会产生错误,这可能会导致不应有的否决票。YMMV。