0

我有一个Flight类代表飞行员日志中的一次飞行。它由以下属性组成:

  • 期间
  • 登陆
  • 评论

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

我有关于将到达和离开建模为 a Movement,它将由机场和时间组成。然后我会从 中派生一个Departure和一个ArrivalMovement,并拥有Flight两者的引用之一。

然后我遇到了关于 Ruby 的讨论TrueClassFalseClass为什么 Ruby 有 TrueClass 和 FalseClass 而不是单个布尔类?)。它的要点是 Ruby 不建模truefalse因为Boolean它们不共享任何行为,我相信到达和离开也是如此。即使它们确实共享数据,它们也完全相反。

另一种选择是我简单地将到达和离开的数据字段嵌入到Flight. 我觉得这很尴尬,因为这意味着如果您从Airport模型遍历到出发和到达 ( has_many :departures, has_many :arrivals) 将产生一个Flight模型。

我探索的第三个选项是创建单独的DepartureArrival模型而不从Movement. 但是,由于 aFlight需要同时具有到达和离开,这是引用航班所必需的,因此我们创建了一个讨厌的循环引用(顺便说一下,这也困扰了第一个选项)。

我将如何最好地模拟这种关系?有没有我没有考虑过的替代方案?

4

2 回答 2

1

从 UI 开发人员的角度来说,这是我要开始的。

我怀疑你会经常做两件事——

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

如果属性在飞行中,这些将更容易/更快地完成。您将避免连接。由于信息是必需的,因此无需“has_one”。如果需要,您可以随时在迁移后移动它们。保持简单,直到用例出现。

我认为通过简单地查看航班的到达机场 ID,在机场创建 has_many :arrivals (属于航班类型)也会更容易。

于 2013-01-11T18:38:52.750 回答
1

如果您希望 Arrival 和 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

于 2013-01-11T18:46:35.357 回答