Ruby on rails 你如何确保“有很多总是”;有一个最小的“;?

Ruby on rails 你如何确保“有很多总是”;有一个最小的“;?,ruby-on-rails,Ruby On Rails,假设我正在编写代码来模拟公交车站 每个总线组始终至少有一条总线。我想找出在模型中实现这个最小值的最佳方法。车队中的最后一辆巴士永远不会被摧毁,除非车队本身也在被摧毁 一种方法是捕获总线对象上的关系 class Bus ... before_destroy :check_minimum_busses_on_parent end 然而,这在很大程度上忽视了单一责任原则。这辆公共汽车正在处理车队问题,这不是它的问题 我可以在销毁之前用方法创建一个总线观察者。现在一切都是单一的责任了,感觉好像

假设我正在编写代码来模拟公交车站

每个
总线组
始终至少有一条
总线
。我想找出在模型中实现这个最小值的最佳方法。车队中的最后一辆巴士永远不会被摧毁,除非车队本身也在被摧毁

一种方法是捕获
总线
对象上的关系

class Bus
  ...
  before_destroy :check_minimum_busses_on_parent
end
然而,这在很大程度上忽视了单一责任原则。这辆公共汽车正在处理车队问题,这不是它的问题

我可以在销毁之前用
方法创建一个
总线观察者
。现在一切都是单一的责任了,感觉好像我们有更多的物体在不必要的地方晃动

class BusObserver < ActiveRecord::Observer
  def before_destroy bus
    false if bus.fleet.busses.count <= 1
  end
end
这显然是进入了纯粹丑陋的领域。你可以把它包装成一个方法
。bus\u可以被销毁吗?
,它位于fleet对象上,但这并不是一个更好的方法


获得我想要的东西的最干净的方法是什么?

您是否可以拥有一个Decommissioner类,在给定总线的情况下,它可以适当地处理业务逻辑?这似乎是清楚和合理的

如果您对记录退役事件感兴趣,它甚至可以是ActiveRecord模型

大致如下:

class BusDecommissioner
  def initialize(bus)
    @bus = bus
  end
  def decommissionable?
    @bus.fleet.buses.size > 1
  end
  def decommission!
    @bus.destroy if decommissionable?
  end
end

它能用吗?根据文档,您可以在删除之前使用
回调并停止删除。

您还可以定义一个停用!方法,以便您可以调用fleet.decommission!(公共汽车)。我想这正是我要找的。将确认实验后您是否有让此回调正常工作的经验?我不能让它着火:不,我自己没有试过。我只是在文档中找到了它,并认为它可以解决您的问题。我试图在github上浏览rails源代码,但在那里没有找到任何东西。因此,它可能已被删除:-(更新,我还发现:您可能必须接受该记录作为回调方法中的参数?不知道它是否有效,但指南和示例说您应该这样做。我无法将您的答案标记为正确,因为我认为这是不可能的,但我已经对它和您的评论进行了投票,以给您打分
class BusDecommissioner
  def initialize(bus)
    @bus = bus
  end
  def decommissionable?
    @bus.fleet.buses.size > 1
  end
  def decommission!
    @bus.destroy if decommissionable?
  end
end