Rails 5.1使用多种货币进行不同的总和计算

时间:2018-01-21 08:11:21

标签: ruby-on-rails sum ruby-on-rails-5 currency calculation

我正在使用Rails应用程序来支付我的费用 基本上我输入一些费用,给出姓名,描述,金额,货币和日期 为此,我有3个模型:用户,支出,货币与这种关系:

class Currency < ApplicationRecord

    has_many :spendings
    has_many :users, through: :spendings

end

class Spending < ApplicationRecord

    belongs_to :user
    belongs_to :currency

end

class User < ApplicationRecord

  has_many :spendings
  has_many :currencies, through: :spendings

end

我使用users_controller中的show来索引每个用户开销。这就是我在users_controller中的内容

class UsersController < ApplicationController

    def show
        @user_spendings = @current_user.spendings.all.order('date DESC').paginate(:page => params[:page], :per_page => 10)
        @user_amount = @user_spendings.sum(:amount)
    end
end

在这种情况下,@ user_amount显示了来自current_user的所有费用,问题是我有2种货币(将来可能更多),我想根据选择的货币显示不同的总金额我创造了新的费用 我在这里想到了不同的东西,我尝试做一个If语句,这样只有当currency_id ==如果是€或者如果是$或者等于2时,金额才会显示...但是如果我添加新货币,这将无法正常工作(和我无法使它工作。) 也许一个循环?循环通过货币,以某种方式显示总金额。但你不能在一个循环中做一笔钱,所以我不知道 此外,我希望它具有灵活性,因此如果将来我添加更多我不需要触及代码的货币。
有什么想法?
如果需要,这是我的show.html.erb

  <% @user_spendings.each do |spending| %>
  <tr>
    <td><%= spending.title %></td>
    <td><%= spending.description %></td>
    <td><%= '%.02f' % spending.amount %></td>
    <td><%= spending.currency.symb %></td>
    <td><%= spending.date.strftime('%d %B %Y') %></td>
  </tr>
  <% end %>

非常感谢。

3 个答案:

答案 0 :(得分:0)

如果您已经在表格之间设置了关系,则可以通过执行以下操作实际访问belongs_to Spendings的所有Currency

Currency.all.each do |c|
  c.spendings.sum(&:amount)
end

或者对于每种货币,您都可以这样做:

Currency.first.spendings.all

检查第一次 Currency

上的所有费用
Currency.first.spendings.sum(&:amount)

检查第一次 Currency的所有费用总和

当然,可以对所有其他具有has_many - belongs_to关系

的模型进行此操作

答案 1 :(得分:0)

做一些事情:

@sums_by_currency = Currency.joins(:spendings).
  select(:symb, 'SUM(spendings.amount) AS amount').
  where(spendings: { id: @user_spendings.map(&:id) }).
  group(:symb)

允许您按以下方式迭代货币:

@sums_by_currency.each do |currency|
  "#{currency.symb}#{currency.amount}"
end

@sums_by_currency.each do |currency|
  number_to_currency(currency.amount, unit: currency.symb)
end

在你看来。

答案 2 :(得分:0)

我知道还有其他答案,但这是我的方法。

控制器

class UsersController < ApplicationController

  def show
    @user = current_user
    @spendings = @user.spendings
    @currencies = @user.currencies
  end

end

模型

class Currency < ApplicationRecord

  has_many :spendings
  has_many :users, through: :spendings

  def user_spendings user
    spendings.where(user_id: user.id)
  end

  def total_user_spendings user
    user_spendings(user).sum(:amount)
  end

end

查看

<h2>Spendings summary by currency</h2>
<table>
  <% @currencies.each do |currency| %>
    <tr>
      <td><%= currency.symb %></td>
      <td><%= currency.name %></td>
      <td><%= '%.02f' % currency.total_user_spendings @user %></td>
    </tr>
  <% end %>
</table>

<h2>Detailed spendings</h2>
<table>
  <% @spendings.each do |spending| %>
    <tr>
      <td><%= spending.title %></td>
      <td><%= spending.description %></td>
      <td><%= '%.02f' % spending.amount %></td>
      <td><%= spending.currency.symb %></td>
      <td><%= spending.date.strftime('%d %B %Y') %></td>
    </tr>
  <% end %>
</table>