0

before_validationActiveRecord の最新バージョンでは、単純な宣言を使用して任意の数のハンドラーを定義できます。

class MyModel < ActiveRecord::Base
  before_validation :do_something
  before_validation :do_something_else
end

Sequel を使用すると、これを行うことができる唯一の方法は、古い ActiveRecord メソッドに似ているように見えます。

class MyModel < Sequel::Model
  def before_validation
    super

    do_something
    do_something_else
  end
end

簡略化された宣言を追加するプラグインはありますか、それともそのままですか? Sequel のドキュメントには、あまり明確な図が描かれていません。MyModel.before_validationクラスメソッドが定義されていません。

更新:以下の回答が示すように、この動作は既定では存在しません。これを修正する Sequel::Model プラグインを作成しました、sequel_simple_callbacksと呼ばれます

4

2 に答える 2

1

Brian Campbell が述べたように、validation_class_methodsプラグインを使用できます。推奨されていませんが、サポートされています。プラグインは、メソッド内のインスタンス メソッドとして使用するために、プラグインvalidation_helpersが提供する同様のヘルパーを提供します。validation_class_methodsvalidate

バリデーションをインスタンス メソッドとして記述することは、IMO より優れたアプローチです。これが、Sequel が推奨する理由です。検証は、本質的にインスタンス レベルのアクティビティであり、クラス レベルのアクティビティではありません。クラス レベルのバリデーションでは、条件付きバリデーションなどの処理には特別な構文 ( など:if=>proc{}) が必要であり、インスタンス メソッドで通常の条件付きルビ ステートメント ( 、 、 など) を使用ifできelseますcase

明らかに、ActiveRecord から来ているのであれば、それは別のアプローチです。Sequel は ActiveRecord の動作を複製しようとはしませんが、2 つのライブラリはいくつかの点で同様に動作します。

于 2010-08-25T18:51:40.343 に答える
1

Sequel には、validation_class_methods検証を追加するためのクラスメソッド ベースのインターフェイスを提供するプラグイン があるようです。検証ドキュメントによると、これは従来の互換性のみを目的としていますが、そのインターフェイスを好む場合は、それを使用しても問題ありません。

于 2010-08-25T14:51:06.727 に答える