我觉得这是一个非常简单的问题,但我无法在任何地方找到答案!
问题:
如果我之前有这样的has_many关系:has_many :wikis
,我是否会保留这种关系,如果我稍后创建一个has_many关系,如下所示?
has_many :collaborators
has_many :wikis, through: :collaborators
这完全在我的用户模型中。
背景
在我的rails应用程序中,我有一个User模型和一个Wiki模型。我只是让用户能够在私有wiki上进行协作,因此我迁移了一个Collaborator模型,然后通过关系创建了has_many。在放置has_many :wikis
之后,我不确定是否仍然需要has_many :wikis, through: :collaborators
。
我感到困惑的原因是因为用户仍然能够在没有合作者的情况下创建wiki而且我不确定has_many through
关系如何在幕后工作。
最初我只有User和Wiki有一对多的关系。
# User model
class User < ApplicationRecord
...
has_many :wikis # should I delete this?
has_many :collaborators
has_many :wikis, through: :collaborators
...
end
# Collaborator model
class Collaborator < ApplicationRecord
belongs_to :user
belongs_to :wiki
end
# Wiki model
class Wiki < ApplicationRecord
belongs_to :user
has_many :collaborators, dependent: :destroy
has_many :users, through: :collaborators
...
end
答案 0 :(得分:0)
当当has_many存在时,has_many仍然需要吗?
has_many
像您的模型一样时, has_many through
不是必需的
has_many :wikis # should I delete this?
has_many :collaborators
has_many :wikis, through: :collaborators
我应该删除吗?
是的,你可以删除这个,你不需要这个belongs_to
has_many关联表示与另一个模型的一对多连接。您经常会在&#34;其他方面找到这种关联&#34;属于一个关联。此关联表示模型的每个实例都具有零个或多个另一个模型的实例。例如,在包含作者和书籍的应用程序中,作者模型可以声明为:
The has_many :through Association
has_many :through
关联通常用于与另一个模型建立多对多连接。该关联表明通过继续第三模型,声明模型可以与另一模型的零个或多个实例匹配。例如,考虑一种患者预约看医生的医疗实践。相关的协会声明可能如下所示:
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
您只能使用has_many
关联而不使用has_many :through
,但这是一对多,这不是很多对
has_many
关联(不含has_many :through
)是与其他模型的一对多连接has_many :through
关联与另一个模型建立了多对多连接<强>更新强>
看,一位医生可能有很多患者,另一方面,一位患者可能有很多医生,如果您使用has_many
关联,而不是通过患者,那么这称为one-to-many
关联,这意味着一位医生有很多病人,另一方面,一名病人属于一名医生,现在协会看起来像这样
class Physician < ApplicationRecord
has_many :patients
end
class Patient < ApplicationRecord
belongs_to :physician
end
更新2
has_many
通过标准格式编辑后的模型
# User model
class User < ApplicationRecord
...
has_many :collaborators
has_many :wikis, through: :collaborators
...
end
# Collaborator model
class Collaborator < ApplicationRecord
belongs_to :user
belongs_to :wiki
end
# Wiki model
class Wiki < ApplicationRecord
has_many :collaborators, dependent: :destroy
has_many :users, through: :collaborators
...
end