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 %>

И вуаля! Хороший график всех ставок в группе. Я использовал тот же метод, что и расчет, и это сработало!! Оле!!

Другие вопросы по тегам