Ruby on rails 对于口袋妖怪及其进化来说,自加入是正确的关联吗?

Ruby on rails 对于口袋妖怪及其进化来说,自加入是正确的关联吗?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在努力研究口袋妖怪与其进化之间的正确关联。我想我已经接近正确答案了,但我在尝试建立完整的模型时遇到了问题。这是我努力实现的目标 bulbasaur = Pokemon.find(1) bulbasaur.evolved_forms ---> [ivysaur, venasaur] ivysaur = Pokemon.find(2) ivysaur.evolved_forms ----> [venusaur] ivysaur.pre-evolved_forms ---> [

我正在努力研究口袋妖怪与其进化之间的正确关联。我想我已经接近正确答案了,但我在尝试建立完整的模型时遇到了问题。这是我努力实现的目标

bulbasaur = Pokemon.find(1)
bulbasaur.evolved_forms ---> [ivysaur, venasaur]

ivysaur = Pokemon.find(2)
ivysaur.evolved_forms ----> [venusaur]
ivysaur.pre-evolved_forms ---> [bulbasaur]

venusaur = Pokemon.find(3)
venusaur.evolved_forms ----> []
venusaur.pre-evolved_forms ---> [ivysaur, bulbasaur]
我有下面的型号

class Pokemon < ApplicationRecord
   has_many :evolved_forms, class_name: "Pokemon", foreign_key: "pre-evolved_form_id"
   belongs_to :pre-evolved_form, class_name: "Pokemon", optional: true

   has_many :pre-evolved_forms, class_name: "Pokemon", foreign_key: "evolved_form_id"
   belongs_to :evolved_form, class_name: "Pokemon", optional: true
end
class口袋妖怪

这似乎是可行的,但我觉得好像缺少了一些东西,比如说应该有一些通过关联而产生的很多东西。如果有人有更好的模型,我将感谢反馈。谢谢。

我想说,你走的路是对的,但还没有走到那一步。 对你的目标有效的是树形结构(又称层次结构)。因此,口袋妖怪会有许多进化形式,只有一种它所属的预进化形式(或者相反)。基于这一关系,整个逻辑可以工作,你可以访问任何单个口袋妖怪的所有进化形式和所有预进化形式

class Pokemon < ApplicationRecord
   belongs_to :pre_evolved_form, class_name: 'Pokemon', foreign_key: 'pre_evolved_form_id', optional: true
end
class口袋妖怪
通过自己实现这一点,您需要编写助手方法来访问进化形式(后代对象)和预进化形式(上升对象)。 尽管如此,我还是建议您研究一个名为
祖先
的宝石,它会让事情变得更简单。他们的自述似乎写得很好,所以我不会试图比他们解释得更好


还可以查看层次对象结构。

可能有更好的方法,但我会(嵌套地)像下面这样做。它还可以与Eevie和其他具有多条进化线的口袋妖怪协同工作

class口袋妖怪
示例用法
oddish=Pokemon.find(1)
# => 
奇怪的。下一个进化出的形式
# => [  ]
阴郁=古怪。下一个是进化的形式
# => 
阴郁。下一种形式
# => [ ,  ]
vileplume=glud.next\u演变\u forms.first
# => 
bellossom=阴郁。下一个是进化的。下一个是形式
# => 
#测试嵌套方法:
奇怪的祖先进化而来的形式
开始
{}
=结束
奇怪的后代进化出的形式
开始
{
=> {
=> {},
=> {}
}
}
=结束
阴郁的祖先进化出的形式
开始
{
=> {}
}
=结束
阴暗的、后代的、进化的、形式的
开始
{
=> {},
=> {}
}
=结束
祖先进化的形式
开始
{
=> {
=> {}
}
}
=结束
vileplume.后代的进化形式
开始
{}
=结束
bellossom.祖先(进化)形态
开始
{
=> {
=> {}
}
}
=结束
bellossom.后代_进化_形式
开始
{}
=结束
待办事项:
将模型验证添加到口袋妖怪中,以防止“堆栈级错误”,如果“进化”以某种方式循环回到起点(这永远不会发生)。

在可能的情况下避免重新发明轮子总是很好的

您可能会在祖先宝石中发现一些好处,它用于将模型组织到树结构中,这正是您的目标


谢谢您的解决方案@Jay Ar Polidario我很感激!