使用“has_many”vs“has_many,通过”rails中的关系

时间:2017-03-20 11:09:59

标签: ruby-on-rails orm relational-database has-many-through has-many

我是rails和web-dev的新手。

目前我正在使用rails 4中的“活跃记录协会”

我对“has_many”与“has_many,通过”关系的使用感到困惑。

例如,如果我的模式中有Physician,Appointment和Patient模型(如导轨指南所示)

和rails教程建议我这样做。

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

但如果我像这样建立关系

class Physician < ApplicationRecord
  has_many :appointments
end

class Appointment < ApplicationRecord
  belongs_to :physician
  has_many :patients
end

class Patient < ApplicationRecord
  belongs_to :appointment
end

我认为两者都可以正常工作。

但我想知道他们之间存在的差异以及他们为什么要通过“关系”来实现这种差异。

感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:0)

has_many through是一种连接两个不相关的独立模型/表并减少表中重复/冗余的方法,其中has_many表示更多的指令关系。

也许约会和医生的例子并不清楚。我会给另一个人。

class Artist
  has_many :paintings
  has_many :purchases
  has_many :buyers, through: :purchases
end

class Painting
  belongs_to :artist
end

class Purchase
  belongs_to :painting
  belongs_to :buyer
end

class Buyer
   has_many :paintings_buyers
   has_many :painting, through: :purchases
end

谈论你的榜样。

首先,您没有方便的方式获得医生的专利。唯一的方法是:

physician.appoitments.map(&:patient).uniq

这将导致

  1. 表现不佳
  2. 无法使用sql过滤实体,只能使用ruby(再次表现不佳)
  3. 另外,您是否注意到我使用了uniq?这是因为当相同的患者被多次指定给同一位医生时,患者的表会有很多重复。