私はバスデポをモデル化するコードを書いています。どのようにhas_manyが常に「最小値」を持つことを保証しますか?
バスの各fleet
には常に少なくとも1つのbus
があります。私はこの最小限の数値をモデルに適用する最善の方法を見つけ出す必要があります。艦隊の最後のバスは、艦隊そのものが破壊されていない限り、破壊することはできません。
1つの方法は、bus
オブジェクトの関係をキャプチャすることです。
class Bus
...
before_destroy :check_minimum_busses_on_parent
end
しかし、これは単一責任の原則を広く無視しています。バスは問題ではない艦隊の問題に取り組んでいます。
代わりにbefore_destroy
メソッドを使用してbus_observer
を作成することができます。すべてが今や単一責任であり、必要以上に多くの物体が揺れ動いているように感じます。
class BusObserver < ActiveRecord::Observer
def before_destroy bus
false if bus.fleet.busses.count <= 1
end
end
これは確かに仕事を行いますが、私はそれが本当に所属Fleet
クラスからデカップリング約100%満足していません。艦隊は親fleet
オブジェクト自体が破壊され、それは私も結局、最後のバスを取り除きたいかもしれないという可能性を可能にするために、その最後のバス
を破壊するためにまだ許可
class BusObserver < ActiveRecord::Observer
def before_destroy bus
if bus.fleet.busses.count <= 1
false unless bus.fleet.currently_being_destroyed?
end
end
end
これは明らかに純粋な醜さのレルムを入力している:バスは艦隊のは、あまりにもチョップを取得するかどうかを把握することができますので、いくつかのクロス通信を必要とします。艦隊オブジェクトに座っている方法.bus_can_be_destroyed?
にそれを書き込むことができますが、それはずっと良いことではありません。
私が最後のものを得る最もクリーンな方法は何ですか?
廃炉を定義することもできます。メソッドを使用して_fleet.decommission!(bus)_を呼び出すことができます。 –