【问题标题】:Calculate and display the balances from bottom to top in ruby on rails在 ruby​​ on rails 中计算并显示从下到上的余额
【发布时间】:2021-02-11 06:58:01
【问题描述】:

为了按降序显示记录,我使用了“created_at DESC”,它适用于表的所有条目,即日期列、详细信息列、借方和贷方列,余额除外,它是仍然从上到下计算和显示。但我想从下到上计算和显示。这可以在下图中看到。

expenses_controller.rb

类费用控制器

  def index
     @expenses = Expense.order("created_at DESC")
  end

为了更好地理解,请找到下图的银行对帐单,因为我需要做到这一点。

index.html.erb

<% balance = 0 %>

<div class="container">

    <table style="width:100%">
      <thead>
        <tr>
          <th>Date</th>
          <th>Particulars</th>
          <th>Debit</th>
          <th>Credit</th>
          <th>Balance</th>
          </tr>
      </thead>
    
      <tbody>
        <% @expenses.each do |expense| %>
          <tr>
            <td><%= expense.date.strftime('%d/%m/%Y') %></td>
            <td><%= expense.particulars %></td>
            <td class="pos"><%= expense.debit %></td>
            <td class="neg"><%= expense.credit %></td>
            <% balance += expense.debit.to_f-expense.credit.to_f %>
            <% color = balance >= 0 ? "pos" : "neg" %>
            <td class="<%= color %>"><%= number_with_precision(balance.abs, :delimiter => ",", :precision => 0) %></td>
          </tr>
        <% end %>
      </tbody>
    </table>
</div>

欢迎提出任何建议。

提前谢谢你。

【问题讨论】:

  • Expense.order("created_at DESC") 表示最新的在顶部,而我想它应该是 ASC。无论如何,在这种情况下,我无法弄清楚余额 2500, 1500, 2000 是从哪里来的。你能忘记代码并展示预期结果背后的逻辑吗?
  • 感谢您的回复。我希望将最新的放在顶部。余额 2500、1500、2000 是表中显示的预期输出。
  • 我已经更新了帖子,以便通过添加真实的银行对帐单来更好地理解。希望对您有所帮助。

标签: ruby ruby-on-rails-6.1


【解决方案1】:

我仍然不明白余额列[2500, 1500, 2000] 是如何计算的,但我可以从截图中争论一些事情。

基本上,您是按模型中不存在的列进行排序的。因此,首先您需要构建该帮助列,填充它,然后按该列排序。 应该可以在 SQL 中做到这一点,但我在普通的 Ruby 中使用哈希作为假数据库来展示。您可以根据自己的情况轻松调整它或寻找最有效的方法 (SQL)。

假设数据如下:

expenses = [{date: 1, narration: :a, debit: 3.0, credit: 0},
            {date: 2, narration: :b, debit: 0.15, credit: 0},
            {date: 3, narration: :c, debit: 75.0, credit: 0}]

而初始余额为:

balance = 1434.64

现在让我们循环数据,添加新字段balance 并在循环结束时排序:

expenses.each do |h|
  balance += h[:credit] - h[:debit]
  h[:balance] = balance
end.sort!{ |h| h[:balance]}

现在您排序的expenses 是:

[
  {:date=>3, :narration=>:a, :debit=>75.0, :credit=>0, :balance=>1356.49}
  {:date=>2, :narration=>:b, :debit=>0.15, :credit=>0, :balance=>1431.49}
  {:date=>1, :narration=>:c, :debit=>3.0, :credit=>0, :balance=>1431.64}
]

您可以在控制器中进行计算,然后将expenses 传递给视图并循环,而无需在那里进行任何计算。


对于您的 rails 应用程序,您可以按如下方式实现。

将临时字段balance添加到您的模型(无需向数据库添加列)并初始化为值0

class Expense < ApplicationRecord
  attr_accessor :balance

  after_initialize :init

  def init
    self.balance = 0
  end
end

在控制器中进行计算,我使用初始值balance,只是为了模拟示例:

def index
  @expenses = Expense.all

  balance = 1434.64
  @expenses.each do |e|
    balance += e.credit - e.debit
    e.balance = balance
  end

  @expenses = @expenses.sort{ |e| e.balance }    
end

那么在你看来,只需循环:

<% @expenses.each do |expense| %>
  <tr>
    <td><%= expense.narration %></td>
    <td><%= expense.debit %></td>
    <td><%= expense.credit %></td>
    <td><%= expense.balance %></td>
  </tr>
<% end %>

如果您按照示例插入记录,您应该得到以下结果:

# ["c", "0.0", "75.0", "1356.49"]
# ["b", "0.0", "0.15", "1431.49"]
# ["a", "0.0", "3.0", "1431.64"]

【讨论】:

  • 感谢您的精彩回复。请查看代码pastebin.com/mkWJVPKk,我看到余额显示为零,我是否需要在 _form.html.erb 中创建余额字段。
  • 您现在是否将balance 添加到您的模型中?在这种情况下,您应该在每次保存记录时更新该字段。当您修改或删除一条记录时,您需要重新计算balance 并更新所有受影响的记录。阅读您的问题balance 不是模型的属性,我的解决方案是可行的。在这里查看:stackoverflow.com/questions/9697041/…
  • 是的,我已通过迁移将余额列添加到费用模型中。我不明白,如何每次更新以保存记录并重新计算余额。
  • 我添加了 Rails 实现,希望现在更清晰。
  • 非常感谢您的实施。在余额栏中,当有足够的余额时,我必须用红色显示它,当余额变少意味着负数时,我必须用黑色显示它。例如,如果先前余额为 300,借方为 500,则表示公司必须支付 200,这将在“余额”列中显示为 -200。我想要的是显示余额是否减负,黑色显示没有 - 符号,如果余额变为“+”,则显示为红色,我该怎么做。
【解决方案2】:

如果您需要先按创建日期排序,然后按余额排序,您可以使用

@expenses = Expense.order('created_at DESC, balance DESC')

【讨论】:

  • 感谢您的回复。我试过但得到了相同的结果。
【解决方案3】:

既然你告诉它通过Expense.order('created_at desc') 订购,那么它就是这样做的。如果你想通过余额订购,你必须改为说Expense.order('balance desc')

【讨论】:

  • 感谢您的回复。我试过但没有得到想要的结果。中间条目达到预期,但第一个和最后一个条目仍未达到预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多