3

次のようなビジネス主導の検証を備えたモデルがある状況に何度か遭遇しました。

class Order < ActiveRecord::Base
  validates_numericality_of :total, :greater_than => 5.0

  # Some more logic
end

ある時点で、上司は新しい最小注文を$ 10にすることを決定したので、検証を10に更新します。ただし、これは、値が$ 5〜 $ 10の既存の注文は検証されなくなり、私が呼び出すロジックはすべて検証されなくなることを意味します。 order.save()は失敗し始めます(時には不快に静かに)。私はこれに何度も大きな出荷Railsアプリで遭遇しましたが、まだ良い解決策を見つけていません。いくつかのアイデア:

  1. コード変更がロールアウトされたときに影響を受ける保留中の「注文」がないことを確認してください
  2. 新しい検証にを追加します:if => Proc.new { |o| o.created_at.nil? or o.created_at > date_new_validation_is_effective }が、これがすぐに扱いにくくなることは確かです
  3. モデルの検証としてではなく、ユーザー指定の入力が受け入れられるコントローラーなど、他の場所でビジネスルールを「検証」します。しかし、これはRailsに多くの支持者がいるFat Model /SkinnyControllerの原則に違反しています。

このロジックを統合するため、または#2のような戦略を長期的に管理しやすくするための別のアプローチはありますか?

4

2 に答える 2

2

このビジネス ロジックの検証を実行のみに設定できます:on => :create。注文の合計を編集/更新することはあまりないと思います。

これにより、システム内の既存のモデルの有効性に影響を与えることなく、今後のすべての注文に対して有効になります。

于 2013-08-24T18:29:35.193 に答える
1

注文レコードとバージョン固有の検証にバージョンを追加できます。

于 2013-02-08T06:43:44.177 に答える