0

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

费用_控制器.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>

任何建议都非常受欢迎。

先感谢您。

4

3 回答 3

1

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

@expenses = Expense.order('created_at DESC, balance DESC')
于 2021-02-11T07:09:46.543 回答
1

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

基本上,您正在按模型中不存在的列进行排序。因此,首先您需要构建该帮助列,填充它,然后按该列排序。应该可以在 SQL 中执行此操作,但我使用 Hash 作为假数据库以纯 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到模型中(无需向数据库添加列)并初始化为 value 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"]
于 2021-02-11T11:39:22.677 回答
0

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

于 2021-02-11T07:02:45.560 回答