2016-02-14 2 views
0

Я хочу, чтобы иметь возможность возвращать некоторые данные с контроллера, чтобы я мог создать линейный граф в JavaScript с помощью gon gem.Возврат необходимых данных из контроллера Rails

У меня есть две модели:

account: id[PK, int], name[string], credit[boolean], active[boolean] 
balance: id[PK, int], account_id[FK, int], balance[decimal], date[date] 

class Account < ActiveRecord::Base 
    has_many :balances 
end 

class Balance < ActiveRecord::Base 
    belongs_to :account 
end 

Для всех дат в «противовесов», я хочу, чтобы вернуть сумму счетов, где активное вещество «т» и где активна является «F», а разница ,

Это некоторые примерные данные:

Account.create(name: 'Natwest', active: 't', credit: 'f') 
Account.create(name: 'Cash', active: 't', credit: 'f') 
Account.create(name: 'Capital One CC', active: 't', credit: 't') 
Balance.create(account_id: '1', balance: '100', date: '31/10/2015') 
Balance.create(account_id: '1', balance: '500', date: '30/11/2015') 
Balance.create(account_id: '1', balance: '50', date: '31/12/2015') 
Balance.create(account_id: '2', balance: '500', date: '30/09/2015') 
Balance.create(account_id: '2', balance: '240', date: '31/10/2015') 
Balance.create(account_id: '2', balance: '50', date: '30/11/2015') 
Balance.create(account_id: '3', balance: '200', date: '30/09/2015') 
Balance.create(account_id: '3', balance: '150', date: '31/10/2015') 
Balance.create(account_id: '3', balance: '140', date: '30/11/2015') 

Эти ожидаемые результаты:

- 30/09/2015: 
    active: 500 
    inactive: 200 
    difference: 300 
- 31/10/2015: 
    active: 340 
    inactive: 150 
    difference: 190 
- 30/11/2015: 
    active: 550 
    inactive: 140 
    difference: 410 
- 31/12/2015: 
    active: 50 
    inactive: 0 
    difference: 50 

Я думаю, мне нужно, чтобы создать хэш для достижения этой цели, и я могу вернуть даты в порядке возрастания как показано ниже, но я не уверен, как вернуть значения active, inactive и difference.

@test = Hash[ 
    Balance.joins(:account).order(date: :asc).group_by(&:date) 
] 

ответ

1

Вы можете использовать:

def hash_template 
    Hash.new do |k, v| 
     k[v] = Hash.new { |k1,v1| k1[v1] = 0 } 
    end 
    end 

Balance.joins(:account) 
     .order(date: :asc) 
     .group_by(&:date) 
     .each_with_object(hash_template) do |stats, memo| 
    date = stats.first 
    users = stats.second 
    memo[date][:active] = users.select { |b| b.account.active }.sum(&:balance) 
    memo[date][:inactive] = users.select { |b| !b.account.active }.sum(&:balance) 
    memo[date][:difference] = memo[date][:active] - memo[date][:inactive] 
end 
#=> 
{Wed, 30 Sep 2015=>{:active=>700.0, :inactive=>0, :difference=>700.0}, 
Sat, 31 Oct 2015=>{:active=>490.0, :inactive=>0, :difference=>490.0}, 
Mon, 30 Nov 2015=>{:active=>690.0, :inactive=>0, :difference=>690.0}, 
Thu, 31 Dec 2015=>{:active=>50.0, :inactive=>0, :difference=>50.0}} 
+0

Спасибо, однако, глядя на ваши результаты, они неправильно и не соответствует тому, что я должен ожидать. Все неактивные результаты = 0. – Bhav

+0

активна ваша учетная запись. См. Ваш вопрос) – Ilya

+0

А, да. Моя ошибка. Я действительно хотел вернуть баланс, где для 'b.account.credit' и'! B.account.credit' и разница, но мне удалось изменить ваш код, чтобы сделать это. Спасибо. – Bhav

Смежные вопросы