0

TL;DR:如何使用连接表创建has_one 关联反之亦然?through belongs_to

上下文:我有两个模型,ProcessLogEncounterProcessLog,顾名思义(有点),保存外部进程(多次运行)的单次运行(对应于数据库中的一行)的日志。另一方面,Encounter是一个跟踪某些信息 X 的模型。Encounters 可以在内部产生,也可以作为前面提到的外部过程的成功执行的结果。它意味着不是所有 Encounter的 s 都有关联的ProcessLog也不是所有 ProcessLog的 s 都有关联的Encounter。但是,如果有一个ProcessLogfor an Encounter,这是一个1:1 的关系。一个Encounter 不能超过一个ProcessLog和一个ProcessLog不能属于多个Encounter。从数据库设计的角度来看,这是一个optional relationship(我希望我没有忘记我的课程)。在数据库中,这将使用encounter_id作为主键和外键process_log_id的连接表进行建模

Rails:在 Rails 中,1:1 关系通常在使用连接表的情况下建模,并且该belongs_to表通常具有另一个表的外键。所以在我的情况下,这将encounter_idprocess_logs表格中。

问题has_one:使用and的传统 Rails 方法belongs_to,这将导致表中的许多行process_logs具有列的NULLencounter_id。现在,Rails 的这种方法有利有弊,但是,我不打算在这里讨论。是的,它将使表结构保持简单,但是,在我的情况下,它破坏了语义并且还引入了许多NULL值,我认为这不是一个好方法。这也是可选关系存在连接表的原因。

到目前为止我做了什么?: 除了以下两个链接的文档之外,我找不到很多关于这个主题的有用文档,尽管它们有自己的问题并且不能解决我的问题。

  1. 所以问题这里的方法是使用 has_many 作为连接模型,而我只有一个

  2. 讨论RoR

我创建了一个连接模型EncounterProcessLog(它同时belongs_to用于ProcessLogEncounter),然后has_one ..., through:在其他两个模型上创建了一个连接模型,但 Rails 正在寻找多对多关联,当然还要encounter_idprocess_logs桌面上寻找。

问题:我怎样才能实现我打算在这里实现的目标?下面的(非工作)代码行中的一些东西:

class Encounter:
    has_one :process_log, through: :encounter_process_logs

class ProcessLog:
    belongs_to :encounter, through: :encounter_process_logs # This may be incorrect way of specifying the relationship?

class EncounterProcessLog:
    belongs_to :encounter
    belongs_to :process_log # May be this should be a has_one?

我希望有人能够指导我正确的方向。感谢您到目前为止的阅读。

4

1 回答 1

1

我能想到的一种方法是:

class Encounter:
  has_one :encounter_process_log
  has_one :process_log, through: :encounter_process_log

class ProcessLog:
  has_one :encounter_process_log
  has_one :encounter, through: :encounter_process_log

class EncounterProcessLog:
  belongs_to :encounter
  belongs_to :process_log

这将返回process_logfor encounter,反之亦然,这可能是您想要的。

于 2021-07-20T09:12:10.100 回答