次のようなビジネス主導の検証を備えたモデルがある状況に何度か遭遇しました。
class Order < ActiveRecord::Base
validates_numericality_of :total, :greater_than => 5.0
# Some more logic
end
ある時点で、上司は新しい最小注文を$ 10にすることを決定したので、検証を10に更新します。ただし、これは、値が$ 5〜 $ 10の既存の注文は検証されなくなり、私が呼び出すロジックはすべて検証されなくなることを意味します。 order.save()は失敗し始めます(時には不快に静かに)。私はこれに何度も大きな出荷Railsアプリで遭遇しましたが、まだ良い解決策を見つけていません。いくつかのアイデア:
- コード変更がロールアウトされたときに影響を受ける保留中の「注文」がないことを確認してください
- 新しい検証にを追加します
:if => Proc.new { |o| o.created_at.nil? or o.created_at > date_new_validation_is_effective }
が、これがすぐに扱いにくくなることは確かです - モデルの検証としてではなく、ユーザー指定の入力が受け入れられるコントローラーなど、他の場所でビジネスルールを「検証」します。しかし、これはRailsに多くの支持者がいるFat Model /SkinnyControllerの原則に違反しています。
このロジックを統合するため、または#2のような戦略を長期的に管理しやすくするための別のアプローチはありますか?