0

在我的应用程序中,我有三个感兴趣的模型。第一个是 Patient 模型,它有_many Record 模型。类似地,Record 模型 has_many 诊断模型。最初,我让 Patient 模型通过以下方式访问诊断:

:has_many :diagnoses, :through => :records

但是我遇到的问题是我还希望 Patient 模型能够创建一个独立于 Record 模型的诊断对象。例如,在入院期间,患者可能被诊断出患有新疾病。然而,她也可能有过某种疾病的历史(先前的诊断),所以我想跟踪它而不必求助于创建新模型。

我尝试使用这里描述的多态关联,这样我的模型看起来像:

class Patient < ActiveRecord::Base
  has_many :records
  has_many :diagnoses, :as => :medical_history
  # ...
end

class Record < ActiveRecord::Base
  belongs_to :patient
  has_many :diagnoses, :as => :medical_history
  # ...
end

class Diagnosis < ActiveRecord::Base
  belongs_to :medical_history, :polymorphic => true
  # ...
end

我遇到的问题是,虽然我可以通过 Record 对象成功创建 Diagnosis 对象,但当我调用p.diagnosespPatient 对象在哪里)时,它并没有像我期望的那样让我访问所有 Diagnosis 对象。

重申一下,我想要的是能够通过 Record 模型或通过 Patient 模型创建一个 Diagnosis 对象,但能够让 Patient 模型访问通过其自身或通过 Record 模型创建的所有 Diagnosis 对象(这应该是可能的,因为 Record 模型属于 Patient 模型)。

我很确定这是我并没有真正理解多态关联是如何工作的,而且我也可能完全滥用了多态关联。所以我感谢所有的帮助。谢谢!

4

1 回答 1

1

我认为您对多态性的使用是合适的。

通过记录创建的诊断(在此上下文中是一个令人困惑的术语,因为它可能表示患者记录或数据库记录)不会自动添加到患者。您需要做以下两件事之一:

  1. 在 Record 模型上使用回调(例如 after_save),将所有诊断添加到 Record.patient 并调用 Record.patient.save。请注意,您的 Patient 也可能有回调,因此请注意他们不要互相调用。

  2. 在 Patient 中添加一个方法,以便在需要时将 p.diagnoses 与 p.records.diagnoses 结合起来。如(未经测试的代码):

    def diagnoses_all
      // you could memoize this if so inclined
      (diagnoses + records.collect{|r| r.diagnoses}.flatten).uniq
    end
    

无论哪种情况,您都可以随时调用 Patient.records.diagnoses,这样就不会丢失知识。但是,在第一种情况下,如果您想知道哪些诊断是通过 Patient 创建的,则必须编写另一种方法来基本上反转 diagnostics_all,即从 Patient.diagnoses 中减去 Patient.records.diagnoses。

为了更好地了解正在发生的事情,请查看为 3 个表生成的(假设为 SQL)模式。在控制台中,实例化一个 Patient,调用 p.diagnoses 和 p.records.diagnoses,查看生成 SQL 的日志。

于 2012-06-01T13:38:14.543 回答