我有患者的用户。但我想为用户添加彼此分享患者的能力。目前我在SharedPatient表创建,user_id指示患者已与哪个用户共享,patient_id指示患者。这是有效的,但我必须获取User.patients,然后在SharedPatient表中查询他们有权访问的其他患者的ID,然后在Patient表中查询他们的患者记录。
我真的只是希望能够调用User.patients并检索他们共享的患者和他们自己创建的患者。指示用户是否是创建者的布尔值似乎是在它们之间进行排序的可靠方式,但我担心它有点hacky。是否有一种首选的方式来解决这个或我忽视的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
答案 0 :(得分:1)
我建议在它们之间添加一个关系模型(可以命名为Contact,或者不同的东西,我将在下面使用Contact)。然后在该模型上添加一个标志,指示该用户是该患者的主要(或创建者或您想要的任何术语)。然后,您可以添加关联以将它们组合在一起:
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
答案 1 :(得分: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])
@patient=@user.patients.first
@users=@patient.users
等等,你得到了照片。
对于第二部分,您应该在您的Patient表中添加一个额外的user_id字段,例如creator_id,它将保存创建患者的用户的id。然后在你user.rb:
has_many :created_patients, :class_name => "Patient", :foreign_key => 'creator_id'
在你的病人身上.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