我有一个项目,人们需要在他们之间交换信贷。
我要这么做
用户模型
class User < ApplicationRecord
after_create :create_bank_account
has_one :bank_account, inverse_of: :user, dependent: :destroy
has_many :account_transactions, inverse_of: :user, through: :bank_account
end银行模型
class BankAccount < ApplicationRecord
belongs_to :user, inverse_of: :bank_account
validates :balance, presence: true, numericality: true
validates :user, presence: true
has_many :account_transactions, inverse_of: :bank_account, dependent: :destroy
accepts_nested_attributes_for :account_transactions
before_validation :load_defaults
def load_defaults
if self.new_record?
self.balance = 4.0
end
end账户交易模型
class AccountTransaction < ApplicationRecord
after_initialize :set_default_status, if: :new_record?
after_commit :transfer, on: :create
belongs_to :bank_account, inverse_of: :account_transactions
enum transaction_type: [ :Received, :Sent ]
enum status: [ :Approved, :Canceled ]
def set_default_status
self.status ||= :"Approved"
end
private
def transfer
source_account = BankAccount.find(source)
target_account = BankAccount.find(target)
ActiveRecord::Base.transaction do
source_account.balance -= amount
target_account.balance += amount
source_account.save!
target_account.save!
end
end
end信贷转帐运转良好。
但是我需要用每个用户的bank_id创建记录。
我将如何创建这两个帐户交易记录?
用户A的bank_id记录和用户B的bank_id记录。
我不知道处理用户间事务的最好方法是否是这样。
发布于 2019-05-26 23:01:33
为什么AccountTransaction需要2条记录?我强烈建议您在bank_account模型中保存2个AccountTransaction I,请参见:
# acount_transaction.rb
class AccountTransaction < ApplicationRecord
after_initialize :set_default_status, if: :new_record?
after_commit :transfer, on: :create
belongs_to :target_bank_account, foreign_key: 'target_id', class_name: 'BankAccount'
belongs_to :source_bank_account, foreign_key: 'source_id', class_name: 'BankAccount'
enum transaction_type: [ :Received, :Sent ]
enum status: [ :Approved, :Canceled ]
def set_default_status
self.status ||= :"Approved"
end
private
def transfer
ActiveRecord::Base.transaction do
self.source_bank_account.balance -= amount
self.target_bank_account.balance += amount
source_bank_account.save!
target_bank_account.save!
end
end
end您只需要创建一个新的迁移,将target_id和source_id添加到AcountTransaction中。
如果您这样做,您将能够保存在一个记录的source_account和target_account,这是更有意义的,你认为呢?
更新
您应该删除bank_id并创建2个新的foreing_keys:target_bank_id和source_bank_id for AccountModel。
在BankAccount模型中,可以添加以下行:
# bank_account.rb
has_many incoming_transfers, foreign_key: 'target_bank_id', class_name: 'AccountTransaction'
has_many made_transfers
, foreign_key: 'source_bank_id', class_name: 'AccountTransaction' 在此之后,您可以检查每个BankAccount有多少个传输是作出和接收的!
您可以看到更多关于这种关联点击这里!的信息。
https://stackoverflow.com/questions/56317383
复制相似问题