Ruby on rails 3 Rails 3中模型多态关联的可能误用

Ruby on rails 3 Rails 3中模型多态关联的可能误用,ruby-on-rails-3,associations,polymorphic-associations,Ruby On Rails 3,Associations,Polymorphic Associations,在我的应用程序中,我有三个感兴趣的模型。第一个是病人模型,它有许多记录模型。同样,记录模型有许多诊断模型。最初,我让患者模型通过以下方式访问诊断: :has_many :diagnoses, :through => :records 然而,我遇到的问题是,我还希望患者模型能够独立于记录模型创建诊断对象。例如,在入院期间,患者可能被诊断出患有新的疾病。然而,她也可能有病史(先前的诊断),因此我想记录下来,而不必求助于创建新模型 我尝试使用如上所述的多态关联,使我的模型看起来像: class

在我的应用程序中,我有三个感兴趣的模型。第一个是病人模型,它有许多记录模型。同样,记录模型有许多诊断模型。最初,我让患者模型通过以下方式访问诊断:

:has_many :diagnoses, :through => :records
然而,我遇到的问题是,我还希望患者模型能够独立于记录模型创建诊断对象。例如,在入院期间,患者可能被诊断出患有新的疾病。然而,她也可能有病史(先前的诊断),因此我想记录下来,而不必求助于创建新模型

我尝试使用如上所述的多态关联,使我的模型看起来像:

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
class Patient:病史
# ...
结束
类记录:病史
# ...
结束
类诊断true
# ...
结束
我遇到的问题是,虽然我可以通过Record对象成功创建诊断对象,但当我调用
p.diagnostics
(其中
p
是一个患者对象)时,它并不能像我期望的那样让我访问所有诊断对象

重申一下,我希望能够通过记录模型或患者模型创建诊断对象,但能够让患者模型访问通过自身或记录模型创建的所有诊断对象(这应该是可能的,因为记录模型属于患者模型)


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

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

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

  • 在您的记录模型上使用回调(例如,保存后),将所有诊断添加到Record.patient并调用Record.patient.save。请注意,您的患者也可能有回拨,因此请注意不要让他们互相回拨

  • 在患者中添加一种方法,以便在需要时将p.Diagnostics与p.records.Diagnostics相结合。如(未测试的代码):

  • 在任何一种情况下,您都可以呼叫Patient.records.diagnostics,这样就不会丢失知识。但是,在第一种情况下,如果您想知道哪些诊断是通过Patient创建的,则必须编写另一种方法来基本上反转诊断,即从Patient.Diagnostics中减去Patient.records.Diagnostics


    为了更好地了解发生了什么,请查看为这3个表生成的(假设为SQL)模式。在控制台中,实例化一名患者,调用p.diagnostics和p.records.diagnostics,查看生成的SQL的日志。

    谢谢pduey,我使用了类似于您的第二个选项的方法实现了这一点-很高兴知道我在使用多态关联方面没有完全偏离目标(尽管如果有人不同意,我很高兴听到原因)。
    def diagnoses_all
      // you could memoize this if so inclined
      (diagnoses + records.collect{|r| r.diagnoses}.flatten).uniq
    end