Implement in Controller
bash
vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
from = BankAccount.find 1
to = BankAccount.find 2
BankAccount.transaction do
to.money += from.money
from.money = 0
from.save!
to.save!
end
render text: 'success'
end
Implement in Model
vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
BankAccount.transfer_money(1, 2)
render text: 'success'
end
bash
vi app/models/bank_account.rb
app/models/bank_account.rb
class BankAccount < ActiveRecord::Base
class << self
def transfer_money(f, t)
from = BankAccount.find f
to = BankAccount.find t
self.transaction do
to.money += from.money
from.money = 0
from.save!
to.save!
end
end
end
end
Implement in Service
bash
mkdir app/services
bash
vi config/application.rb
Add this line.
It might not need it.
You can check like this.
irb
puts ActiveSupport::Dependencies.autoload_paths
application.rb
config.autoload_paths += %W(#{config.root}/app/services)
restart rails
bash
rails s -b 0.0.0.0
bash
vi app/services/bank_account_transfer_service.rb
bank_account_transfer_service.rb
class BankAccountTransferService
def initialize(f, t)
@from = BankAccount.find f
@to = BankAccount.find t
end
def transfer_money
BankAccount.transaction do
@to.money += @from.money
@from.money = 0
@from.save!
@to.save!
end
end
end
bash
vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
bat_service = BankAccountTransferService.new(1,2)
bat_service.transfer_money
render text: 'success'
end