首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用不同的ID创建2个记录?

如何使用不同的ID创建2个记录?
EN

Stack Overflow用户
提问于 2019-05-26 21:09:20
回答 1查看 55关注 0票数 0

我有一个项目,人们需要在他们之间交换信贷。

我要这么做

用户模型

代码语言:javascript
复制
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

银行模型

代码语言:javascript
复制
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

账户交易模型

代码语言:javascript
复制
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记录。

我不知道处理用户间事务的最好方法是否是这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-26 23:01:33

为什么AccountTransaction需要2条记录?我强烈建议您在bank_account模型中保存2个AccountTransaction I,请参见:

代码语言:javascript
复制
# 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_idsource_id添加到AcountTransaction中。

如果您这样做,您将能够保存在一个记录的source_accounttarget_account,这是更有意义的,你认为呢?

更新

您应该删除bank_id并创建2个新的foreing_keystarget_bank_idsource_bank_id for AccountModel

BankAccount模型中,可以添加以下行:

代码语言:javascript
复制
# 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有多少个传输是作出和接收的!

您可以看到更多关于这种关联点击这里!的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56317383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档