0

Я пытаюсь получить текущий баланс за транзакцию, простое суммирование (Кредит до записи - Дебиты до записи) в упорядоченном списке.Rails Получение текущего баланса с упорядоченным списком - суммарный виртуальный атрибут

Задача состоит в том, что транзакции часто выводятся из строя, а журналы транзакций сортируются по полю «Даты» (с указанием даты, когда оно должно было быть введено) и «кредитами» сначала (чтобы оно показывало платежи перед счетами в тот же день).

Ассоциация сортируется:

has_many :rent_logs, :order => [:dated, "credit desc"] 

Данные представлены Двойники к следующему

[ID] Dated Label Credit Debit Balance [Needs excel summation look] 
[20] 1/1/13 payment 600.0   -30 * [Should be: 600 ] 
[1 ] 1/1/13 Rent Due  630.0 -30  [Ok here : -30 ] 
[2 ] 2/1/13 Rent Due  630.0 -660  [Ok here : -660] 
[28] 2/6/13 Late Fee  50.0 -710  [Ok here : -710] 
[7 ] 3/1/13 payment 1200.0   -140* [Should be: 490 ] 
[3 ] 3/1/13 Rent Due  630.0 -140  [Ok here : -140] 

* Indicates massive fail on running balance 

Я получил это, выполнив метод ниже в модели аренды.

def balance_to_date(date) 
... 
    rent_logs.where("dated <= ?", date).sum(:credit) - rent_logs.where("dated <= ?" ,date).sum(:debit) 
    #problem with above is that it calculates day by day, rather than record by record. 
end 

Проблема заключается в том, что я не хочу, чтобы она отличалась от всех предыдущих в дате интереса. Я хочу, чтобы это изменило все предыдущие по текущей записи.

Нет других очевидных свойств, чтобы делать условия или фильтры, о которых я могу думать. Лучшее решение, которое я могу думать о уродливый один, который, вероятно, должен получить меня уволили ...:

def balance_to_transaction(id) 
    balance = rent_logs.where("dated <= ?", date-1.day).sum(:credit) - rent_logs.where("dated <= ?" ,date-1.day).sum(:debit) 
    rent_logs.where("dated = ?", date).each do |transaction| 
    balance += transaction.credit 
    balance -= transaction.debit 
    if (id == transaction.id) 
     break 
    end 
    end 
    balance 
end 

Это не может быть правильный способ сделать это?

Я использую Rails 3.2.12, Ruby 1.9.3

Благодаря Фил

ответ

1

Проблема заключается в том, что вы используете дату как условие, которое не делает никакой разницы между записями в тот же день , Чтобы решить эту проблему, используйте ID для различия между записями.

def balance_to_item(date, id) 
... 
    rent_logs.where(["dated < ? or (dated = ? and ID <= ?)", date, date, id]).sum(:credit) - 
    rent_logs.where(["dated < ? or (dated = ? and ID <= ?)", date, date, id]).sum(:debit) 
end 

Чтобы рассчитать весы, необходимо указать элемент транзакции.

+0

Будет ли это работать, если идентификаторы не являются частью заказа? Например, id 5 может появиться сразу после id 6, вместо естественного подсчета 4,5,6 он может выглядеть как 20, ** 6 **, 5,7,8. но я использую: кредит для сортировки, чтобы он мог это сделать ... – nevieandphil

+0

Если идентификатор не является частью заказа, тогда это приведет к некоторому запуску балансовых заказов. Если вы используете кредит для заказа, то нулевые значения vill также смешивают вещи, поэтому я рекомендую вам использовать идентификатор вместо этого, даже в заказе. Он меняет порядок только в данный день, поэтому его не путают. – Matzi

+0

Да, когда я упрощу порядок для ассоциации с [: датированным:: id], это отлично работает и намного проще и чище, чем любая другая реализация, которую я собирал. Спасибо Маци! – nevieandphil

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