rails has_many vs has_many通过?

时间:2014-10-29 23:19:41

标签: ruby-on-rails

我是铁杆的新手,所以这可能是一个微不足道的问题。在阅读教程时,我已经阅读了关于标识符has_many和has_many的关系。我似乎无法理解的是它们之间的区别。例如,如果我有3个模型,医生,预约和患者

 class Doctor< ActiveRecord::Base
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ActiveRecord::Base
  belongs_to :doctor
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  has_many :appointments
  has_many :doctors, through: :appointments
end

难道我不能只说医生了吗:病人和病人有很多人:医生和他们有关系吗?通过约会来完成这项工作的目的是什么?

谢谢

2 个答案:

答案 0 :(得分:0)

使用“通过”表的唯一原因是您希望使用中间表中包含的某些相关数据,在这种情况下,是与医生和患者相关的约会数据。

此外,has_many需要相关belongs_to,反之亦然,因此您必须在两个模型中使用has_and_belongs_to_many来表示多对多关系,并创建相应的加入表格即可。

否则,是的,您只需在各自的文件中使用has_and_belongs_to_many :patientshas_and_belongs_to_many :doctors

特别注意Rails Guide中的第2.8节。它可能需要一些阅读,但一旦你得到它,它将是有道理的,我保证。

答案 1 :(得分:0)

你是对的。如果您说医生has_many :patients和患者has_many :doctors,那么他们就会相关。

但是,我认为本教程所涉及的是多对多关联。

如果医生模型和患者模型通过has_many相关,则医生专门拥有患者,患者拥有医生。但通常情况可能并非如此。医生可以有很多患者,这些患者不必专属于医生;他们可能还有其他医生。

多对多关联进来时。在多对多关联中,对象可以包含许多属于的对象但不是唯一的。它就像医生模型和患者模型之间的关联。

有两种方法可以创建多对多关联:

  1. has_and_belongs_to_many
  2. has_many #something through: #joining table
  3. 在您的情况下,您正在使用第二种方式,使用加入表assocation

    有关这两项的详细说明,请查看此Railscast。此外,这this official Rails documentation on associations会有所帮助。