Rails Association Guidance

时间:2015-06-22 18:15:58

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-3.2

我是rails 4的新手。我已经完成了很多教程并尝试解决以下问题。但仍然没有成功。任何人都可以指出我正确的方向。如何处理以下场景的关联。

情景:

1. Patient can have many surgeries.

2. Surgery has two types (Patient will undergo only one surgery at a time.)
   a.) Surgery Type A (if chosen, record 15 column fields values)
   b.) Surgery Type B (if chosen, record 25 column fields values)

3. Surgery Type A can be of any one type.
  a.) unilateral (if chosen, record 10 column fields for unilateral & skip bilateral)
  b.) bilateral  (if chosen, record 10 column fields for bilateral  & skip unilateral)

4. Surgery Type B can be of any one type.
  a.) unilateral (if chosen, record 10 column fields for unilateral & skip bilateral)
  b.) bilateral  (if chosen, record 10 column fields for bilateral  & skip unilateral)

enter image description here

我需要一些正确处理关联的建议。这有点令人困惑,我需要根据每种手术类型和子类型(单边或双边)记录表中的大量字段值。什么是最好的处理方式此方案的关联以及稍后为报告目的轻松获取数据。

先谢谢

1 个答案:

答案 0 :(得分:3)

因此,你的情况的复杂部分是你有一件事(手术)可以有许多不同的类型,不同的类型有不同的领域。这个问题有很多不同的方法,我不相信对“最佳方式”有广泛的共识。

第一种也是最简单的方法(至少从数据模型的角度来看),“只需将其全部放在一件事上” - 制作一个手术模型,给它一个surgery_type字段来指定它是哪种类型,并为所有45个字段提供一个记录,然后在视图中使用逻辑仅显示基于surgery_type字段的相关字段,并验证仅存在这些字段,依此类推。

更复杂的变体是Single Table Inheritance,其中你有多个模型,但它们都存在于同一个表中。

这种方法有一些明显的缺点 - 45个字段很多,而且当大多数字段对于任何给定记录都是空的时,这会感到浪费(并且可能会对性能产生影响)。这就是为什么存在各种其他模式的原因。

因此,作为替代方案,有Multiple Table Inheritance,Rails通过polymorphism实现。在这种模式中,患者has_many Surgeries,但这是一个多态关联,这意味着它可以引用多种类型的其他对象。在这种模式中,您将有两个或四个代表手术类型的模型,并将每个模型与患者相关联。例如,UnilateralEndocrineSurgery模型只需要其十个字段。多态性的缺点包括使得使用Surgery对象组更加困难,因为它们具有不同的类型并且对不同的方法做出响应。

这些方法的相对优势很复杂且经常引起争议,并且列举它们超出了SO答案的范围。