Rails中强制性的一对一关系

时间:2013-01-11 18:28:23

标签: ruby-on-rails ruby oop

我有一个Flight课程,代表飞行员日志中的航班。它由以下属性组成:

  • 持续时间
  • 着陆
  • 备注

它还有一个机场以及出发和到达的时间,这与我的问题有关。

我有关于到达和离开的建模是Movement,它将由机场和时间组成。然后,我会从Departure派生ArrivalMovement类,并且Flight引用其中一个。

然后我讨论了Ruby的TrueClassFalseClassWhy does Ruby have TrueClass and FalseClass instead of a single Boolean class?)。它的要点是Ruby不会将truefalse建模为Boolean,因为它们不会共享任何行为,我相信它们的到达和离开也是如此。即使它们共享数据,它们也完全相反。

另一个选择是我只是将到达和离开的数据字段嵌入Flight。我发现这很尴尬,因为这意味着如果你要从Airport模型遍历到离开和到达(has_many :departureshas_many :arrivals)会产生Flight模型。 / p>

我探讨的第三个选项是创建单独的DepartureArrival模型而不继承Movement。但是,由于要求Flight同时具有参考航班所需的到达和离开,我们已经创建了一个令人讨厌的循环引用(顺便说一下,它也困扰了第一个选项)。

我如何才能最好地塑造这种关系?我有没有考虑过任何替代方案?

2 个答案:

答案 0 :(得分:1)

从UI开发人员的角度讲,这就是我的开始。

我怀疑你经常做两件事 -

1)在列表中显示航班,并在列表项中包含出发和到达信息 2)按出发和到达时间对列表进行排序

如果属性在航班上,这些将更容易/更快。你会避免加入。由于信息是必需的,因此无需'has_one'。如果需要,您可以随后在迁移中移动它们。在用例出现之前,请保持简单。

我认为通过简单地查看航班的到达机场ID,您也可以更轻松地在机场进行一次has_many:到达(类型为Flight)。

答案 1 :(得分:1)

如果您希望Arrival and Departure共享许多功能,请考虑使用主动支持问题或抽象父类。

继承:

class Movement < ActiveRecord::Base
  self.abstract_class = true
end

class Departure < Movement
end

模块:

http://www.fakingfantastic.com/2010/09/20/concerning-yourself-with-active-support-concern/

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html