表 Transaction 和 User - Ruby on Rails 应该使用啥样的关系?

Posted

技术标签:

【中文标题】表 Transaction 和 User - Ruby on Rails 应该使用啥样的关系?【英文标题】:What kind of relationship should be used for tables Transaction and User - Ruby on Rails?表 Transaction 和 User - Ruby on Rails 应该使用什么样的关系? 【发布时间】:2021-03-10 04:32:32 【问题描述】:

我是新手。我刚开始学习更多关于使用 Ruby on Rails 的后端。 我有以下表格 - User 和 User_Transaction。

所以基本上我想要一个交易来保存有关发送者和接收者的信息。这在我个人看来更像是 has_and_belongs_to_many 关系。但是,我真的很困惑如何解决这个问题以及我应该如何包含 2 个外键。 我很想了解更多有关这方面的信息,如果有人帮助我,我会非常高兴:)。

迁移 用户

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.integer :username
      t.integer :password
      

      t.timestamps
    end
  end
end

交易

class CreateTransactions < ActiveRecord::Migration[6.0]
  def change
    create_table :transactions do |t|
      t.string :sender
      t.string:receiver
      t.decimal :amount
      

      t.timestamps
    end

  end
end

模型

交易

class ::Transaction < ApplicationRecord
  #We have two users per transaction 'Sender' and 'Receiver'
    has_and_belongs_to_many :users
    # belongs_to :sender, :class_name => 'User'
    # belongs_to :receiver, :class_name => 'User'
end

用户

class User < ApplicationRecord
  # has_many :accounts
  # has_many :transactions
  has_and_belongs_to_many :transactions

end

【问题讨论】:

从下面应用建议的解决方案 - 尚未找到解决方案。我想知道是否应该引入更多的cols?因为当我尝试通过以下方式创建事务记录时得到ActiveRecord::AssociationTypeMismatch (User(#14620) expected, got 1 which is an instance of Integer(#4340))Transaction.create(:sender =&gt; "ff",:receiver =&gt; "ss", :amount = &gt; 100) 【参考方案1】:

这个怎么样:

迁移

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :username
      t.string :password

      t.timestamps
    end
  end
end

class CreateTransactions < ActiveRecord::Migration[6.0]
  def change
    create_table :transactions do |t|
      t.references :sender, index: true, null: false, foreign_key: to_table: :users
      t.references :receiver, index: true, null: false, foreign_key: to_table: :users
      t.decimal :amount
      
      t.timestamps
    end

  end
end

模型

class User < ApplicationRecord
  has_many :send_transactions, class_name: "Transaction", foreign_key: :sender, inverse_of: :sender
  has_many :receive_transactions, class_name: "Transaction", foreign_key: :receiver, inverse_of: :receiver
end

class Transaction < ApplicationRecord
  belongs_to :sender, class_name: "User", inverse_of: :send_transactions
  belongs_to :receiver, class_name: "User", inverse_of: :receive_transactions
end

【讨论】:

我插入了 2 个用户,当我尝试 user = User.find(2) 时,我得到了以下内容,第一个用户名:0 为什么是这样? ``` => #``` 哈哈!我复制并粘贴了您的代码,并且您将“用户名”作为“整数”......您希望它是一个“字符串”,然后它可能会正常工作,我将编辑我的答案! 在执行以下 t = Transaction. create(:sender => "filip",:receiver => "George" , :amount => 100) 这不是应该将外键保留为 int 并添加另一个列名作为字符串的情况吗?在这一点上我真的很困惑我真的很抱歉...... 您需要创建用户对象,然后在新创建中使用这些对象:User.create(username: "filip", password: "abcd"); User.create(username: "George", password: "efgh"); Transaction.create(sender: User.first, receiver: User.last, amount: 100);

以上是关于表 Transaction 和 User - Ruby on Rails 应该使用啥样的关系?的主要内容,如果未能解决你的问题,请参考以下文章

django - transaction

CRM User Status profile中Business Transaction字段的用途

CRM User Status profile中Business Transaction字段的用途

性能测试工具LoadRunner06-LR之Virtual User Generator 事务(Transaction)

Django 事务锁定表

Eloquent SUM 和 GET 最新的关系数据