Моя User
модель has_one
Account
, которая имеет столбец balance
.Обеспечить минимальный баланс 0 в десятичной колонке
Наблюдайте:
> alice = User.first
=> #<User id: 1, charge_fee: nil, created_at: "2016-03-19 20:15:14", updated_at: "2016-03-19 20:15:14">
> bob = User.second
=> #<User id: 2, charge_fee: nil, created_at: "2016-03-19 20:15:18", updated_at: "2016-03-19 20:15:18">
> alice.account.balance.to_s
=> "50.0"
> bob.account.balance.to_s
=> "50.0"
Когда один передает пользовательские деньги на другой, баланс отправителя уменьшается, и увеличивается на ресивере:
> alice.account.transfer(to: bob.account, amount:25)
=> nil
> alice.account.balance.to_s
=> "25.0"
> bob.account.balance.to_s
=> "75.0"
Система идеально подходит, за исключением того, что пользователи могут передавать больше денег чем у них, и их баланс переходит в отрицательный:
> alice.account.transfer(to:bob.account, amount:50)
=> nil
> alice.account.balance.to_s
=> "-25.0"
> bob.account.balance.to_s
=> "125.0"
Как сделать принудительно выполнить его так, чтобы команда Account.decrement!('balance', amount)
не удалась, если account.balance
опустился ниже 0
?
Полный источник этой заявки можно найти here. Фактическая increment!
и decrement!
происходит here, вот выдержка:
Account.transaction do
Transaction.create(transaction)
transaction[:to].increment!('balance', transaction[:amount])
transaction[:from].decrement!('balance', transaction[:amount])
Transaction.create(fee_transaction) if transaction[:transfer]
end
Wow, ummm .. ваше форматирование отстой, но это точно строка кода, которую мне нужно было вставить в транзакцию! Спасибо. Я объясню другим людям: Я делаю транзакцию [здесь] (https://github.com/amingilani/rails-bank-app/blob/master/app/models/account.rb#L55). Этот код не выполняет транзакцию, если это не мета-учет (например, депозит, нормальный баланс которого отрицательный). @waleedvic, вы действительно прочитали всю кодовую базу, чтобы выяснить мета-флаг или что-то еще? – amingilani