2017-03-04 7 views
0

私は医者の予約サイトをビルドしています。私はUserモデルを持っており、医者と患者の2つの部分に分けたいと思っています。私は試してみました:一つのモデルから二つのモデルを作る

class User < ActiveRecord::Base 
end 

class Appointment < ActiveRecord::Base 
    belongs_to :physician, class_name: "User" 
    belongs_to :patient, class_name: "User"  
    end 

class Physician < User 
    has_many :appointments 
    has_many :patients, through: :appointments, source: "User" 
end 

class Patient < User 
    has_many :appointments 
    has_many :physicians, through: :appointments, source: "User" 
end 

問題:どのようにphysician_idとpatient_idの列を予定表で取得するのですか? 私はこの方法を選択しました。なぜなら、医師と患者のモデルが分離されていると、登録が問題になるからです(私はそう思います...)。

+0

それはあなたがしようとしているものです表示される。またあなたは、単一テーブル継承やSTIで見たいと思うかもしれません行う。 – Doon

+0

ありがとう!私はあなたの助けに感謝します。 –

答えて

0

あなたは正しい経路にいると思います。マイグレーションを実行するだけで、予定表の医師と患者への参照を追加する必要があります。 しかし、Railsによって推論されるように、患者または医師のhas_manyを通してソース属性を追加する必要はありません。

私は、登録の目的ではなく、単一の責任のために医師と患者のモデルを持っているというこのアプローチも好むと思います!

はそれがこれらの二つのマイグレーションがあなたのテーブルに外部キーを追加する必要があります

+0

それは働いた!しかし、私はその背後にある論理を理解していませんでした:inverse_of ... –

+0

'inverse_of'オプションの詳細はこちら[https://www.viget.com/articles/exploring-the-inverse-of- option-on-rails-model-associations)を参照してください。基本的に、私が実際に使用して見た場所は、関連付けられたレコードを保存するときです。例えば、永続化されていない親の子レコードを作成しようとした場合、親が保存されていないというエラーが表示されますただし、inverse_ofオプションを使用すると、このレコードを保存することができます。 PhysicianとPatientの両方のモデルで 'source'オプションを削除する必要がありますが、冗長になっているように見えますが、 – oreoluwa

0
add_reference :appointments, :patient, foreign_key: true 
add_reference :appointments, :physician, :foreign_key: true 

動作するかどうか私に教えてください。私の構文が絶対に正しいことを確認するために、ドキュメントをチェックしてください。私はあなたが以下の変更を行いたいと考えている提案dpalazzari変更に加え

+0

助けて働いています。あなたの助けを感謝します... –

0

class Appointment < ActiveRecord::Base 
    belongs_to :physician, class_name: "Physician", inverse_of: :appointments 
    belongs_to :patient, class_name: "Patient", inverse_of: :appointments  
end 

class Physician < User 
    has_many :appointments, foreign_key: :physician_id, inverse_of: :physician 
    has_many :patients, through: :appointments, source: "User" 
end 

class Patient < User 
    has_many :appointments, foreign_key: :patient_id, inverse_of: :patient 
    has_many :physicians, through: :appointments, source: "User" 
end 
+0

それは助け!あなたの助けに感謝 –

関連する問題