在我的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;。
等等。
这是我的问题:
这种关联是否可行且值得推荐?
有更好的方法吗?
答案 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