ruby-on-rails - Ruby on Rails | 如何将新行插入具有三个外键的数据库表中
问题描述
我正在使用 Ruby 2.6.3
我有四张桌子:
表#1:交易(id、title)
表#2:旅行(id、name)
表#3:TripBreakdown(id、name)
表#4:TripTransaction(id、transaction_id、trip_id、trip_breakdown_id)
每笔交易都可以属于一次行程和一次行程细分。一个 Trip 有很多交易,一个 TripBreakdown 有很多交易 所以每个 Transaction 属于零个或多个 Trip 和 TripBreakdown。
为此,我创建了表 #4 来存储 transaction_id、trip_id 和 trip_breakdown_id
我想创建 TripTransaction 表,以便 (transaction_id, trip_id, trip_breakdown_id) 都是外键。
这就是模型类的样子:
class Transaction < ApplicationRecord
belongs_to :trip_transaction, optional: true
end
class Trip < ApplicationRecord
has_many :trip_transactions, class_name: "TripTransaction", foreign_key: "trip_transaction_id"
end
class TripBreakdown < ApplicationRecord
has_many :trip_transactions, class_name: "TripTransaction", foreign_key: "trip_transaction_id"
end
class TripTransaction < ApplicationRecord
belongs_to :transactions, class_name: "Transaction", foreign_key: "transaction_id"
belongs_to :trips, class_name: "Trip", foreign_key: "trip_id"
belongs_to :trip_breakdowns, class_name: "TripBreakdown", foreign_key: "trip_breakdown_id"
end
问题:1)我不确定我的模型类是否正确?
2) 如何创建新的 TripTransaction 对象,将其与三个外键连接并将其插入数据库?
如果我有一个外键,文档说我可以做类似的事情,@book = @author.books.create(published_at: Time.now)
但在我的情况下我该怎么做呢?谢谢
解决方案
答案 1:您不需要连接表 (trip_transactions),因为事务具有一趟和一趟细分。您的表事务将具有trip_id 和trip_breakdown_id 列。如果它们可以为零,则在关系中设置 optional: :true 。
您可以简化为:
class Transaction < ApplicationRecord
belongs_to :trip, optional: :true
belongs_to :trip_breakdown, optional: :true
end
class Trip < ApplicationRecord
has_many :transactions
end
class TripBreakdown < ApplicationRecord
has_many :transactions
end
答案 2:可以通过多种方式完成,具体取决于您创建记录的方式。给你一个想法的一个例子是:
@new_transaction = @trip.transactions.new
@new_transaction.trip_breakdown_id = @trip_breakdown.id
@new_transaction.save
推荐阅读
- c# - 如何使用 x、y、width 和 height 属性绘制六边形?
- azure - 我可以将应用服务中的默认 Azure 域与 Azure 应用程序网关一起使用吗?
- android - 为 Firebase 身份验证设置依赖项后,Gradle 项目同步失败
- c# - LINQ group by 包含表
- python-2.7 - Asciimatics 和 Python 出现错误 6
- android - 如何使用 Room 从光标中获取数据
- c# - dll 的引用已从 asp.net 核心 web api 项目中删除,这会干扰已发布的项目
- linux - 我的 sed 命令是否适用于从 JSON 响应中解析特定键的值
- docusignapi - DocuSign 锚选项卡不可修改
- python - Django queryset iterator() 没有按预期工作