TL;DR:如何使用连接表创建has_one
关联,反之亦然?through
belongs_to
上下文:我有两个模型,ProcessLog
和Encounter
。ProcessLog
,顾名思义(有点),保存外部进程(多次运行)的单次运行(对应于数据库中的一行)的日志。另一方面,Encounter
是一个跟踪某些信息 X 的模型。Encounter
s 可以在内部产生,也可以作为前面提到的外部过程的成功执行的结果。它意味着不是所有 Encounter
的 s 都有关联的ProcessLog
,也不是所有 ProcessLog
的 s 都有关联的Encounter
。但是,如果有一个ProcessLog
for an Encounter
,这是一个1:1 的关系。一个Encounter
不能超过一个ProcessLog
和一个ProcessLog
不能属于多个Encounter
。从数据库设计的角度来看,这是一个optional relationship
(我希望我没有忘记我的课程)。在数据库中,这将使用encounter_id
作为主键和外键process_log_id
的连接表进行建模。
Rails:在 Rails 中,1:1 关系通常在不使用连接表的情况下建模,并且该belongs_to
表通常具有另一个表的外键。所以在我的情况下,这将encounter_id
在process_logs
表格中。
问题has_one
:使用and的传统 Rails 方法belongs_to
,这将导致表中的许多行process_logs
具有列的NULL
值encounter_id
。现在,Rails 的这种方法有利有弊,但是,我不打算在这里讨论。是的,它将使表结构保持简单,但是,在我的情况下,它破坏了语义并且还引入了许多NULL
值,我认为这不是一个好方法。这也是可选关系存在连接表的原因。
到目前为止我做了什么?: 除了以下两个链接的文档之外,我找不到很多关于这个主题的有用文档,尽管它们有自己的问题并且不能解决我的问题。
我创建了一个连接模型EncounterProcessLog
(它同时belongs_to
用于ProcessLog
和Encounter
),然后has_one ..., through:
在其他两个模型上创建了一个连接模型,但 Rails 正在寻找多对多关联,当然还要encounter_id
在process_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?
我希望有人能够指导我正确的方向。感谢您到目前为止的阅读。