Rails,Model Association,Child属于parent和has_one父关系

时间:2016-12-15 06:55:19

标签: ruby-on-rails

在我的rails项目中,我希望有这样的结构:

  

论证有很多论点。

     

论证属于论证。

     

论证可以有一个论证(另一个论证,一个新论证)

我的模型可能如下所示:

class Argument < ApplicationRecord
  belongs_to :argumentation
  has_one :argumentation
end

class Argumentation < ApplicationRecord
  belongs_to :argument
  has_many :arguments
end

这是一个例子,我希望它应该如何运作:

  

论证称为&#34;康德&#34;有三个参数&#34; a&#34;,&#34; b&#34;和&#34; c&#34;。

     

论证&#34; c&#34;有一个称为&#34;形而上学&#34;。

的论证      

形而上学#34;形而上学&#34;有两个论点&#34; d&#34;和&#34; e&#34;。

     

等等。

这是我的问题:

  1. 这种关联是否可行且值得推荐?

  2. 有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您不需要编写has_one :argumentation,因为它已经是一对多的关系。所以你的模型应该是这样的。

class Argument < ApplicationRecord
  belongs_to :argumentation
end

class Argumentation < ApplicationRecord
  has_many :arguments
end

这意味着每个参数只有一个参数。这就是一对多关系如何运作的方式。永久论证只有一个argumention_id

答案 1 :(得分:0)

  

这种关联是否可行且值得推荐?

是的,有可能。你只需要正确设置它。

首先,确保使用2个不同的关联名称。

class Argument < ApplicationRecord
  has_one :argumentation
  belongs_to :parent_argumentation, class_name: 'Argumentation'
end

接下来,鉴于上述关联,Rails期望参数表中有一个parent_argumentation_id列,所以添加它。

最后是在论证模型中声明关联

class Argumentation < ApplicationRecord
  belongs_to :argument
  has_many :arguments, foreign_key: :parent_argumentation_id
end

由于此处还声明了belongs_to关联,因此您需要在参数表中添加argument_id列。

提示:使用inverse_of

为了便于阅读并提高效率,请设置inverse_of选项。

class Argument < ApplicationRecord
  has_one :argumentation, inverse_of: :argument
  belongs_to :parent_argumentation, class_name: 'Argumentation', inverse_of: :arguments
end

class Argumentation < ApplicationRecord
  belongs_to :argument, inverse_of: :argumentation
  has_many :arguments, foreign_key: :parent_argumentation_id, inverse_of: :parent_argumentation
end