web-dev-qa-db-ja.com

Rails 3:結合された値を検証する

Rails 2.xでは、検証を使用して、次のような一意の組み合わせ値があることを確認できます。

validates_uniqueness_of :husband, :scope => :wife

対応する移行では、次のようになります。

add_index :family, [:husband, :wife], :unique => true

これにより、夫婦の組み合わせがデータベース内で一意になるようになります。現在、Rails 3では検証構文が変更され、scope属性がなくなっているようです。これは次のようになります。

validates :husband, :presence => true

Rails 3で組み合わせた検証を実現するにはどうすればよいですか? Rails 2.x検証はRails 3でも引き続き機能するため、最初の例を使用できますが、「古い」ように見えますが、もっと良い方法はありますか?

40
Cimm

私と一緒に。 ActiveModelのvalidatesメソッドが機能する方法は、Validatorを探すことです。

:presence => truePresenceValidatorを探し、オプション:trueをバリデーターの初期化子に渡します。

あなたが欲しいと思う

validates :husband, :presence => true, :uniqueness => {:scope => :wife}

(一意性検証ツールは、実際にはActiveModelではなくActiveRecordの一部です。開発者がこれを設定した方法は非常に興味深いものです。非常にエレガントです。)

57
epochwolf