gpt4 book ai didi

ruby-on-rails - 在 PGSQL ActiveRecord 中构建与自定义字符串外键的一对多关系

转载 作者:行者123 更新时间:2023-11-29 11:49:57 25 4
gpt4 key购买 nike

我有下表(仅显示相关字段):

lots
history_id

histories
initial_date
updated_date
r_doc_date
l_doc_date
datasheet_finalized_date

users
username

因此,我正在重建一个现有的应用程序,该应用程序处理相当大量的官僚主义,并且需要跟踪五个不同的日期(如历史表中所示)。我遇到的问题是我不知道如何最好地在 ActiveRecord 中对此进行建模,历史上它是通过将历史表表示为这样来完成的:

histories
initial_date
updated_date
r_doc_date
l_doc_date
datasheet_finalized_date
username

一次只能填充五个日期字段中的一个……在我看来,这是一种糟糕的建模方式……

所以基本上我想在历史记录表中的每个日期与其特定相关用户之间建立一个唯一的可查询连接。是否可以将历史表中的每个时间戳作为外键来查询特定用户?

最佳答案

我认为有一种更简单的方法可以帮助您实现目标。听起来您希望能够查询每个批处理并找到“相关用户”(我猜这是指执行了更新历史表中特定列所需的任何操作的用户)。为此,我首先要在用户和历史记录之间创建一个连接表,称为 user_histories:

user_histories
user_id
history_id

只要更新了很多历史记录并且其中一个相关日期发生变化,我就会在此表上创建一行。但这现在带来了能够区分用户实际更改了哪种特定日期类型的问题(因为有五个)。与其将每个都用作外键(因为它们不一定是唯一的),我建议在 user_histories 表上创建一个“history_code”来表示每个历史日期类型(很像如何使用 polymorphic_type) .导致 user_histories 表如下所示:

user_histories
user_id
history_id
history_code

一个示例记录如下所示:

UserHistory.sample = {
user_id: 1,
history_id: 1,
history_code: "Initial"
}

允许您使用以下内容查询更改历史表中记录的特定用户:

history.user_histories.select { |uhist| hist.history_code == "Initial" }

我建议将这些较长的查询构建到模型方法中,以允许更快、更清晰的查询,例如:

#app/models/history.rb

def initial_user
self.user_histories.select { |uhist| hist.history_code == "Initial" }
end

这应该会给你想要的结果,但应该解决日期不适合外键的整个问题,因为你不能保证它们的唯一性。

关于ruby-on-rails - 在 PGSQL ActiveRecord 中构建与自定义字符串外键的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com