当has_many存在时,has_many仍然是必需的吗?

时间:2018-03-11 01:45:49

标签: ruby-on-rails has-many-through

我觉得这是一个非常简单的问题,但我无法在任何地方找到答案!

问题:

如果我之前有这样的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

1 个答案:

答案 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

The has_many Association

has_many关联表示与另一个模型的一对多连接。您经常会在&#34;其他方面找到这种关联&#34;属于一个关联。此关联表示模型的每个实例都具有零个或多个另一个模型的实例。例如,在包含作者和书籍的应用程序中,作者模型可以声明为:

enter image description here

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

enter image description here

您只能使用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