2

テーブルの会員カード番号が今年のみ一意であることを検証する必要があるため、モデル列のカスタム バリデーターを作成する必要があります。

私の質問は次のとおりです。

  • 単一の行を更新/作成するたびに、今年の一意性を確認するクエリを作成するのは面倒ですか? これにどのように対処する必要がありますか?
  • 私は CakePHP でのみカスタムバリデーターを使用しました。構文例を示すためだけに愚かな例を投稿できますか?

編集1:

現在の年expire_dateは、年-月-日の日付形式であるという列に格納されていることに注意してください。ただし、チェックはその年についてのみ実行する必要があります。どうすればこれに対処できますか?そのため、カスタムバリデーターを使用する必要があると思いますscopeが、この場合は機能しないと思います。

編集2:

オプションに気づいた:ifので、それを介してこれを実装できるかどうかを確認します。

4

2 に答える 2

3

Rails 3はシンタックスシュガーを提供するので、次のようなことができます。

validates :car_number, :uniqueness => {:scope => :expire_year, :message => 'has already been taken this year'}, :on => :update

def expire_year
  expire_date.strftime("%Y")
end

クエリの負荷は、DBスキーマと負荷によって異なります。年の列にインデックスを設定し、レールログを確認することを忘れないでください。

新しいオブジェクトには保存するまでタイムスタンプが入力されないため、これは更新でのみ機能することに注意してください。

于 2012-06-26T02:38:28.063 に答える
2

ActiveRecordはすでにそれを持っています!

validates_uniqueness_of :car_number, :scope => :year

validates_uniqueness_ofのドキュメント

于 2012-06-26T02:34:26.300 に答える