我正在使用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 %>
非常感谢。
答案 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>