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

标签 ruby-on-rails postgresql activerecord

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

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/

相关文章:

ruby-on-rails - 如何在 Rails 之外使用 ActiveRecord?

javascript - 当用户参加测验时,如何停止使用 javascript 或 jquery 打开其他浏览器或选项卡?

ruby-on-rails - 如何在现有的 Rails 应用程序中运行 sinatra?

ruby-on-rails - rails + Heroku : Application Error but logs look ok?

postgresql - 在不同行 block 中具有相同值的窗口函数中的分区

sql - 如何在 Postgres 中使用别名创建嵌套 SELECT COUNT

ruby-on-rails - 如何使用动态属性对问卷数据库关系建模

ruby-on-rails - Will_Paginate Gem With Rails 以错误的顺序显示结果

postgresql - 整数超出范围

ruby - Hstore 和 Rails