Rails多态协会与不同的行为

时间:2012-01-18 08:44:38

标签: ruby-on-rails ruby-on-rails-3

我想创建一个多态Queue关联。我有两个不同的队列,一个是关于创建建筑物,一个是关于创建单位。

虽然队列具有许多相同的属性,例如添加或删除项目,但也存在一些差异。

例如,建筑物具有水平,而单位则没有。 QueuedItem多态类通常有一些方法,比如删除一个。但是,删除方法是不同的,具体取决于项目是建筑物还是单元,需要不同的处理。

此外,级别列对于军队排队项目来说是完全无关紧要的。

所以,我的问题是,基于这些需求,设计它的最佳方法是什么?我应该继续使用3个模型(排队的项目总是属于一个城市):

Building
Unit
QueuedItem -> queued_id, queued_type, city_id

或者我需要添加更多中间模型?你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

根据您的描述,您似乎确实需要队列本身的类,而不仅仅是排队的项目。因此,与队列相关的方法和操作会进入队列类,而只与建筑物或单元相关的东西会进入这些类。

Queue类只包含添加,删除和可能重新排序其元素的方法,所有这些方法都不太可能需要针对不同类型的对象进行不同的实现。除了在队列中添加或删除之外,这些方法除了添加或删除之外没有任何副作用更好 - 例如,如果在删除对象后需要其他事情发生,例如,这可以由Queue #remove的调用者完成。如果您需要队列本身根据它们是否包含建筑物或单元而表现不同,那么您需要一个BuildingQueue和一个UnitQueue,它们都可以从基本的Queue类或包含的Queue模块继承它们的常用方法。

特定于建筑物和单位的其他东西(例如它们是否具有水平,或者它们的具体属性是什么)将适当地进入建筑物和单元类。他们不需要了解队列的行为方式。

答案 1 :(得分:0)

您可以创建一个module,其中包含从队列中添加/删除的逻辑,并将其包含在两个类中。如果您打算在很多类中使用它,您也可以将它移动到插件中,并将帮助程序添加到要作为队列实现的模型中。