表 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 => "ff",:receiver => "ss", :amount = > 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 为什么是这样? ``` => #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 应该使用啥样的关系?的主要内容,如果未能解决你的问题,请参考以下文章
CRM User Status profile中Business Transaction字段的用途
CRM User Status profile中Business Transaction字段的用途
性能测试工具LoadRunner06-LR之Virtual User Generator 事务(Transaction)