0

私のアプリには、関心のある3つのモデルがあります。1つ目はPatientモデルで、has_manyRecordモデルがあります。同様に、レコードモデルhas_many診断モデル。当初、私は患者モデルに次の方法で診断にアクセスさせました。

:has_many :diagnoses, :through => :records

ただし、これに関して私が抱えていた問題は、PatientモデルがRecordモデルとは独立してDiagnosisオブジェクトを作成できるようにすることでもありました。たとえば、入院中に患者は新しい状態と診断される可能性があります。しかし、彼女は病状(事前診断)を持っていた経験もあるかもしれないので、新しいモデルを作成することに頼ることなく、それを追跡したいと思います。

ここで説明するように、モデルが次のようになるように、ポリモーフィックアソシエーションを使用してみました。

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モデルのいずれかを介して診断オブジェクトを作成できることですが、Patientモデルがそれ自体またはRecordモデルを介して作成されたすべてのDiagnosisオブジェクトにアクセスできるようにすることです( RecordモデルはPatientモデルに属しているため、これは可能です)。

これは、ポリモーフィックな関連付けがどのように機能するかを実際には理解していないことであり、ポリモーフィックな関連付けも完全に誤用している可能性があると確信しています。だから私はすべての助けに感謝します。ありがとう!

4

1 に答える 1

1

ポリモーフィズムの使用は適切だと思います。

レコード (患者レコードまたはデータベース レコードを意味するため、このコンテキストでは紛らわしい用語) によって作成された診断は、患者に自動的に追加されません。次の 2 つのいずれかを行う必要があります。

  1. Record モデルでコールバック (after_save など) を使用して、すべての診断を Record.patient に追加し、Record.patient.save を呼び出します。患者もコールバックを持っている可能性があるため、互いに呼び出さないように注意してください。

  2. 必要に応じて p.diagnoses と p.records.diagnoses を組み合わせるメソッドを Patient に追加します。(テストされていないコード)のように:

    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 に答える