【问题标题】:Rails Polymorphic Association With Different BehaviorRails 具有不同行为的多态关联
【发布时间】:2012-01-18 08:44:37
【问题描述】:

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

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

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

此外,等级栏对于军队排队的物品来说完全是微不足道的。

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

Building
Unit
QueuedItem -> queued_id, queued_type, city_id

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

【问题讨论】:

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


    【解决方案1】:

    根据您的描述,您实际上需要队列本身的类,而不仅仅是排队的项目。因此,与队列相关的方法和操作进入队列类,仅与建筑物或单元相关的内容进入这些类。

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

    其他特定于建筑物和单位的东西(例如它们是否有一个级别,或者它们的具体统计数据是什么)将适当地放在 Building 和 Unit 类中。他们不需要知道队列的行为方式。

    【讨论】:

    • 是的,这就是我今天的想法,我认为这可能是最好的方法。但是你认为 Queue 应该是一个具体的类吗?我认为把它做成一个 mixin 模块可能会更好,你同意吗?然后,具体模型 BuildingQueue 将继承。我有点喜欢这个。
    • 在这种情况下,基类或可混合模块都可以正常工作。选择你最喜欢的方法 :)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多