【问题标题】:Sort the balance column in ruby on rails 6在 ruby​​ on rails 6 中对余额列进行排序
【发布时间】:2021-02-16 10:41:33
【问题描述】:

我正在尝试按照下图计算和排序表中的余额列;

为此,我使用@mexpenses = @mexpenses.sort { |e| e.balance } 进行排序,因为它会导致不想要的结果,所以我在下面的代码中注释掉了。

我想达到上图中最右边的BALANCE列所示的结果。

表格中从 Date 列到 Debit 列的所有内容都按需要显示,只有 Balance 列会导致问题。

我想在报表顶部获取最新记录,并带有适当的余额。

注意:数据库中没有余额列。

mexpenses_controller.rb

def index
  @mexpenses = Mexpense.order('date DESC')
  balance = 763.87
  @mexpenses.each do |e|
    balance += e.credit.to_f - e.debit.to_f
    e.balance = balance
  end

  # @mexpenses = @mexpenses.sort { |e| e.balance }  

  respond_to do |format|
    format.html
    format.xls 
  end
end

Mexpense.rb

class Mexpense < ActiveRecord::Base

    validates :particulars, presence: true
    validates :date, presence: true
    
    attr_accessor :balance

    after_initialize :init

    def init
        self.balance = 0
    end
end

index.html.erb

<div class="row">

    <div class="col-md-8 col-md-offset-2">

      <div class="table-responsive myTable">

        <table class="table listing text-center">
          <tr class="tr-head">
            <td>Date</td>
            <td>Particulars</td>
            <td>Credit</td>
            <td>Debit</td>
            <td>Balance</td>
          </tr>

          <tr>
            <td></td>
          </tr>


          <% @mexpenses.each do |mexpense| %>

          <tr class="tr-<%= cycle('odd', 'even') %>">

            <td class="col-1"><%= mexpense.date.strftime('%d/%m/%Y') %></td>

            <td class="col-1" style="width: 50%;"><%= link_to mexpense, mexpense %></td>

            <td class="col-1 neg" style="width: 10%;"><%= number_with_precision(mexpense.credit, :delimiter => ",", :precision => 2) %></td>

            <td class="col-1 pos" style="width: 10%;"><%= number_with_precision(mexpense.debit, :delimiter => ",", :precision => 2) %></td>


            <td><%= number_with_precision(mexpense.balance, :delimiter => ",", :precision => 2) %></td>

          </tr>

          <% end %>

        </table>
      </div>
    </div>

  </div>

20210213052730_create_mexpenses.rb

class CreateMexpenses < ActiveRecord::Migration
  def change
    create_table :mexpenses do |t|
      t.date :date
      t.string :particulars
      t.decimal :debit
      t.decimal :credit

      t.timestamps null: false
    end
  end
end

欢迎提出任何建议。

提前谢谢你。

【问题讨论】:

  • 使用sort_by 代替sort?
  • 另外,我认为您的“期望结果”不正确。看起来您已将值排序为 作为字符串,而不是数字,因此当值中有千位分隔符时,排序会变得很奇怪。
  • 感谢您的回复。我使用了 sort_by 但仍然无法正常工作。如何按数字排序。

标签: ruby ruby-on-rails-6.1


【解决方案1】:
  1. 我强烈建议将balance 列存储在数据库中。每次更改debitcredit 时,都会更新balance 列。

  2. 将 MONEY 存储为 integer!!!!这样可以避免浮点舍入错误。

控制台:

rails g migration add_balance_to_mexpenses balance:integer

迁移:

add_column :mexpenses, :balance, :integer, default: 0, null: false

mexpence.rb - 每当 `mexpence 更改时更新余额列

after_save do
  update :balance, credit - debit
end

现在您可以轻松地按余额排序,这是您数据库中的一个单独字段。比如:

@mexpenses = Mexpense.order(date: :desc, balance: :desc)

【讨论】:

  • 我支持将余额存储在数据库中的建议。但是使用decimal 作为列类型是可以的,因为如果操作正确,它将在内部使用BigDecimal,并且不会出现浮点精度问题。
  • 在数据库中存储余额需要回调来更新所有相关记录,以防更新/删除一行。另外:借方和贷方已经是十进制;初始余额为balance = 763.87;余额计算为balance += e.credit.to_f - e.debit.to_f 然后排序,所以,它已经排序为数字。问题可能出在其他地方。
  • 问题可能出在哪里,我想知道并解决,因为我尝试了数小时和数天但无法解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2010-11-23
相关资源
最近更新 更多