2014-02-26 68 views
0

我有擁有病人的用戶。但我想增加用戶分享病人的能力。此刻,我在SharedPatient表中創建了user_id,指示病人已與哪個用戶共享,patient_id指示病人。這有效,但我必須獲取User.patients,然後在SharedPatient表中查詢他們有權訪問的其他患者的ID,然後在患者表中查詢患者記錄。Rails數據庫架構:共享記錄

我真的只是想調用User.patients並檢索他們共享的患者和他們自己創建的患者。指示用戶是否是創建者的布爾值似乎是在它們之間進行排序的一種可靠方式,但我擔心這有點冒失。有沒有一種首選的方法來解決這個問題或我忽略的ActiveRecord關係?

編輯

class User < ActiveRecord::Base 
    has_many :patients 
    has_many :notes 
    has_many :shared_patients 
end 

class SharedPatient < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    belongs_to :user 
    has_many :recordings, dependent: :destroy 
    has_many :notes, dependent: :destroy 
    has_many :shared_patients, dependent: :destroy 
end 
+1

請分享模型的細節。 –

+0

你可以查看我的答案的底部如何獲得created_by thingy ... –

回答

1

對於你的問題

patient.rb

class Patient < ActiveRecord::Base 

:has_and_belongs_to_many :users, :through => :sharedpatients 
... 
end 

user.rb

class User < ActiveRecord::Base 

:has_and_belongs_to_many :patients, :through => :sharedpatients 
... 
end 

sharedpatient的第一部分.rb

class SharedPatient < ActiveRecord::Base 
:belongs_to :user 
:belongs_to :patient 
... 

end 

因此,舉例來說,你將有:

@user=User.find(params[:id]) 
@[email protected] 
@[email protected] 

等等,你得到的圖片。

對於第二部分,您應該在患者表中添加一個額外的user_id字段,例如creator_id,該字段將包含創建患者的用戶的ID。然後,在你user.rb:

has_many :created_patients, :class_name => "Patient", :foreign_key => 'creator_id' 

,並在您patient.rb:

belongs_to :creator, :class_name => "User", :foreign_key => 'creator_id' 

然後,你將有以下方法:

user.created_patients #list of his own patients 
patient.creator # who is the doctor who created him 
1

我建議增加一個關係模型之間(可能被命名聯繫人,或不同的東西,我將使用以下聯繫方式)。然後在該模型上添加一個標誌,指示用戶是該患者的主要(或創建者或任何您想要的術語)。然後,你可以添加協會,以配合他們一起:

class User < ActiveRecord::Base 
    has_many :contacts, dependent: :destroy 
    has_many :patients, through: :contacts 
end 

class Patient < ActiveRecord::Base 
    has_many :contacts, dependent: :destroy 
    has_many :users, through: :contacts 
end 

class Contact < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :patient 
    # has a boolean attribute named primary 
    scope :primary, -> { where(primary: true) } 
end 
+0

這就是我在第二段中的想法(顯然我沒有很好地描述),但我擔心我錯過了一個更清潔的方式某種程度上。 – Morgan

+0

我向Contact類添加了一個範圍,可以派上用場。 – Coenwulf