我有一个Flight
课程,代表飞行员日志中的航班。它由以下属性组成:
它还有一个机场以及出发和到达的时间,这与我的问题有关。
我有关于到达和离开的建模是Movement
,它将由机场和时间组成。然后,我会从Departure
派生Arrival
和Movement
类,并且Flight
引用其中一个。
然后我讨论了Ruby的TrueClass
和FalseClass
(Why does Ruby have TrueClass and FalseClass instead of a single Boolean class?)。它的要点是Ruby不会将true
和false
建模为Boolean
,因为它们不会共享任何行为,我相信它们的到达和离开也是如此。即使它们共享数据,它们也完全相反。
另一个选择是我只是将到达和离开的数据字段嵌入Flight
。我发现这很尴尬,因为这意味着如果你要从Airport
模型遍历到离开和到达(has_many :departures
,has_many :arrivals
)会产生Flight
模型。 / p>
我探讨的第三个选项是创建单独的Departure
和Arrival
模型而不继承Movement
。但是,由于要求Flight
同时具有参考航班所需的到达和离开,我们已经创建了一个令人讨厌的循环引用(顺便说一下,它也困扰了第一个选项)。
我如何才能最好地塑造这种关系?我有没有考虑过任何替代方案?
答案 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