我是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
我认为两者都可以正常工作。
但我想知道他们之间存在的差异以及他们为什么要通过“关系”来实现这种差异。
感谢您阅读我的问题。
答案 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
这将导致
另外,您是否注意到我使用了uniq
?这是因为当相同的患者被多次指定给同一位医生时,患者的表会有很多重复。