Rails 5.1, сумма по валюте с вложенными ресурсами
У меня проблема с вычислением суммы. У меня есть несколько валют в таблице, у меня есть пользователи, у меня есть группы, и у меня есть таблица ставок. Пользователь может присоединиться к группе через пользователя (user_id и group_id). И пользователь может поделиться своей ставкой через групповые ставки (bet_id и member_id). Я не вхожу здесь подробно, потому что все это работает должным образом.
Я хотел бы сделать некоторые SUM вычисления в групповом представлении (показать). Здесь я хотел бы отобразить общую сумму денег, которую члены группы потратили на ставку. Я также хотел бы использовать чарткик в миксе, чтобы показать хороший график.
Это то, что я до сих пор
Мой контроллер:
m = Member.where(group_id: @group.id)
gs = Groupbet.where(member_id: m)
@tasks = gs.joins(:bet).select("bets.*, sum(amount) as total")
@amount = gs.joins(:bet).
select(:symb, 'bets.*, sum(amount) AS amount').
where(bet_id: { id: @current_user.bets.all.map(&:id) }).
group(:symb)
@tasks работает, но СУММА всех расходов группы, это круто, но у меня есть несколько валют, поэтому сумма не верна. Вот почему я придумал @amount, который в представлении:
<% @amount.each do |amount| %>
<%= '%.02f' % "#{amount.amount}" %>
<%= "#{amount.symb}" %>
<% end %>
вообще ничего не отображать.
: symb это один из столбцов моей валюты между прочим. В валюте у меня есть имя и символы, где символ это: € или $, например. В моей таблице расходов у меня есть сумма столбца и currency_id.
Мои отношения:
class Currency < ApplicationRecord
has_many :bets, dependent: :destroy
has_many :users, through: :bets
end
class Group < ApplicationRecord
has_secure_token :auth_token
has_many :members, :dependent => :destroy
has_many :users, through: :members, source: :user
belongs_to :owner, class_name: "User"
has_many :links, through: :grouplinks
has_many :grouplinks, through: :members
has_many :bets, through: :groupbets
has_many :groupbets, through: :members
has_many :notifications, dependent: :destroy
def to_param
auth_token
end
end
class Groupbet < ApplicationRecord
belongs_to :bet
belongs_to :member
end
class Member < ApplicationRecord
belongs_to :user
belongs_to :group
has_many :grouplinks, dependent: :destroy
has_many :groupbets, dependent: :destroy
validates :user_id, :presence => true
validates :group_id, :presence => true
validates :user_id, :uniqueness => {:scope => [:user_id, :group_id]}
end
class Bet < ApplicationRecord
belongs_to :user
belongs_to :currency
has_many :groupbets, dependent: :destroy
end
class User < ApplicationRecord
has_secure_password
has_many :bets, dependent: :destroy
has_many :currencies, through: :bets
has_many :links, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :members, :dependent => :destroy
has_many :groups, :through => :members
has_one :owned_group, foreign_key: "owner_id", class_name: "Group"
end
Ссылки тут не при чем, но да...
Я также использую групповую дату, и для чарткика я действительно не знаю, потому что, когда пользователь создает ставку, он может фактически зайти в свой профиль и проверить все сделанные им ставки, а также на графике. Чтобы отобразить этот график, который работает, я делаю так:
Мой помощник
def expenses_bet_amount_per_month
@current_user.bets.all.joins(:currency).group('currencies.symb').group_by_month(:date, format: "%B %Y").sum(:amount)
end
дата - это дата, когда пользователь создал ставку. Не спрашивайте, почему я не использовал made_at, не имеет значения:)
И мой взгляд:
<%= column_chart expenses_bet_amount_per_month %>
Это работает. Для одного пользователя. Но для группы я не знаю, как я мог это сделать.
Кто-нибудь может спасти ситуацию? большое спасибо
РЕДАКТИРОВАТЬ:
Код для одного пользователя:
def sums_by_currency_total
Currency.joins(:bets).
select(:symb, 'SUM(bets.amount) AS amount').
where(bets: { id: user_bets_total.map(&:id) }).
group(:symb)
end
def user_spendings_total
user.bets.all
end
Это работает для одного пользователя. Отображение суммы от всех ставок на валюту. Но для группы? Я не знаю
1 ответ
Ок, люди мне удалось!!!!
Я делюсь кодом на случай, если кому-то будет интересно:
def sums_by_currency_group
m = Member.where(group_id: @group.id)
gs = Groupbet.where(member_id: m)
Currency.joins(:bets)
.select(:symb, 'SUM(bets.amount) AS amount')
.where(bets: { id: gs.all.map(&:bet_id) })
.group(:symb)
end
По мнению:
<% sums_by_currency_group.each do |sum| %>
<%= '%.02f' % "#{sum.amount}" %> <%= "#{sum.symb}" %>
<% end %>
И там мы идем. Все суммы из ставок, которые делятся в каждой группе.
Я также решил проблему с графиком удара:
def bets_amount_per_month_group
m = Member.where(group_id: @group.id)
gs = Groupbet.where(member_id: m)
Currency.joins(:bets)
.where(bets: { id: gs.all.map(&:bet_id) })
.group('currencies.symb')
.group_by_month(:date, format: "%B %Y")
.sum(:amount)
end
По мнению:
<%= column_chart bets_amount_per_month_group %>
И вуаля! Хороший график всех ставок в группе. Я использовал тот же метод, что и расчет, и это сработало!! Оле!!