在PGSQL ActiveRecord中构造与自定义字符串外键的1-many关系

时间:2015-07-23 17:10:10

标签: ruby-on-rails postgresql activerecord

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

db.m3.xlarge

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

lots
  history_id

histories
  initial_date
  updated_date
  r_doc_date
  l_doc_date
  datasheet_finalized_date

users
  username

五个日期字段中只有一个可以同时填充...在我看来,这是一种可怕的方式来建模...

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

1 个答案:

答案 0 :(得分:1)

我认为对于你想要完成的事情有一个更简单的方法。听起来你希望能够查询每个批次并找到“相关用户”(我猜这是指用户做了更新历史表上特定列所需的任何操作)。为此,我首先在用户和历史之间创建一个名为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

这应该可以为您提供所需的结果,但是应该解决不适合外键的日期问题,因为您无法保证其唯一性。