首页 > 解决方案 > 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)但在我的情况下我该怎么做呢?谢谢

标签: ruby-on-rails

解决方案


答案 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

推荐阅读