【问题标题】:iterate through and obtain sum遍历并获得总和
【发布时间】:2014-10-13 05:27:56
【问题描述】:

我正在构建一个简单的发票应用程序。我有一个发票模型,它有 :items 和 :items belongs_to :invoice。

就模型架构而言,:invoices 只是有一个用于存储标题的列,而 :items 负责所有(定价)金额和数量的详细信息。

我有一个发票索引,其中显示了发票列表及其“总金额”。每张发票的总金额是通过我在项目模型中设置的“quantity_amount_sum”方法确定的,该方法获取发票的所有项目并将数量乘以金额以确定发票上所有项目的总和。

模型:item.rb

def quantity_amount_sum
   return self.quantity * self.amount
end 

index.html.erb

<% @invoices.each do |invoice| %>
$<%= invoice.item_amount.sum.floor %>
<% end %>

模型发票.rb

  def item_amount
  @@item_amount = self.items.map(&:quantity_amount_sum)
  end

问题在于尝试总结索引页面的“总计”(例如:两张发票,每张都有一个项目总和。发票 #1 总计 100 美元,发票 #2 总计 200 美元。然后我想要一个“总”发票,应为 300 美元)。我已经尝试使用“each do”来遍历每张发票的总数,但我只能检索最后一张发票的总和,而不能将两者结合起来。

$<%= @invoices.total_val.each.sum %>

模型发票.rb

 def self.total_val
     @@item_amount
  end

这将仅生成最后一张发票的总和(或 200 美元),而总数应为 300 美元。

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller


    【解决方案1】:

    如果您想要两张发票的总和,那么您可以更改此行:

    <% @invoices.each do |invoice| %>
    $<%= invoice.item_amount.sum.floor %>
    <% end %>
    

    到这里:

    $<%= @invoices.map(&:item_amount).flatten.sum %>
    

    但是,我看到您正在接近项目来计算发票的总金额。我鼓励您添加一个名为:totalinvoices 表的新列。稍后,您可以在 Invoice 模型中创建回调:

    before_save :update_total
    
    def update_total
      self.total = self.items.map{|i| i.quantity_amount_sum }.sum
    end
    

    当您的数据增长时,这将易于访问和迭代。另外,请确保您在 Item 类中有另一个回调,它会更新相关的 Invoice 的总数,以防正在编辑项目。

    那么你的视图可以改为:

    $<%= @invoices.map(&:total).sum %>
    

    另外,你不必在这里写return

    def quantity_amount_sum
      self.quantity * self.amount
    end 
    

    Ruby 默认返回最后一个表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2022-07-28
      相关资源
      最近更新 更多