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