使用has_and_belongs_to_many获取关联对象rails的列表

时间:2015-05-26 15:15:04

标签: ruby-on-rails ruby associations has-and-belongs-to-many

我有两个模型,ClinicianPatientclinician has_many: patientspatient belongs_to :clinician。第三个模型SharedPatient旨在存储patientsclinicians之间的其他关联,因为patient可以由除clinicians以外的许多其他belongs_to共享{1}}。这是使用has_and_belongs_to_many关系完成的。

见模特:

class Clinician < ActiveRecord::Base
 has_many :patients
 has_and_belongs_to_many :shared_patients, join_table: 'shared_patients'
end

class Patient < ActiveRecord::Base
 belongs_to :clinician
 has_and_belongs_to_many :shared_clinicians, join_table: 'shared_patients'
end

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

这就是我的模型在db中的设置方式:

Clinician:
 first_name: string
 last_name: string
 user_id: integer

Patient:
 clinician_id: integer
 first_name: string
 last_name: string
 user_id: integer

SharedPatient:
 clinician_id: integer
 patient_id: integer

使用这些我想显示clinicianspatient共享的列表。

这就是我现在在控制器中的内容:

@patient = Patient.find_by(user_id: current_user.patient.id)
@clinicianslist = @patient.shared_clinicians

它试图使用以下方式在视图中显示这些:

<% @clinicianslist.each do |list| %>
 <p><%= link_to Clinician.find_by(id: list).full_name, clinician_path(list) %></p>
<% end %>

使用我现在所拥有的,在尝试加载视图时出现错误:

  

患者中的NameError#show

     

未初始化的常数患者:: SharedClinician

运行

时出现同样的错误
  

Patient.find_by(id:1259).shared_clinicians

在控制台中。

有关解决此错误或构建模型以获得我想要的关联的任何建议都会很棒。感谢

2 个答案:

答案 0 :(得分:3)

您不需要SharedPatient模型,因此应将其删除。

错误是因为Rails无法从关联名称或表名中猜出类名。试试这个:

class Clinician < ActiveRecord::Base
 has_many :patients
 has_and_belongs_to_many :shared_patients, join_table: 'shared_patients', class_name: 'Patient'
end

class Patient < ActiveRecord::Base
 belongs_to :clinician
 has_and_belongs_to_many :shared_clinicians, join_table: 'shared_patients', class_name: 'Clinician'
end

这告诉Rails使用哪个类。目前,它正在猜测SharedClinician,这是错误的。

答案 1 :(得分:0)

我想说在这种情况下,使用连接模型并没有那么多意义。例如,如果它是具有自己的数据和逻辑的Appointment对象,那将是有意义的。

相反,您应该创建一个patients_clinicians联接表,并将关系定义为:

class Clinician < ActiveRecord::Base
  has_and_belongs_to_many :patients
end

class Patient < ActiveRecord::Base
  has_and_belongs_to_many :clinicians
end

约定优于配置......