0

Rails 3.2.3では、リンクモデルに2つのフィールドの一意の組み合わせがあることを検証したいと思います。以下に示すように、テストとテストに合格する検証がありますが、これを行うためのより良い方法があるようです。たとえば、一意性のあるインデックスを使用する方がよいでしょうか。もしそうなら、なぜですか?

# link_test.rb
...
test "cannot create two links with same name and url" do
  Link.create!(:name => 'example', :url => 'http://www.example.com')
  assert_raise(ActiveRecord::RecordInvalid, 'could create two links with same name and url'){Link.create!(:name => 'example', :url => 'http://www.example.com')}
end
...

# link.rb
class Link < ActiveRecord::Base
  ...
  validates :name, :uniqueness => {:scope => :url, :message => 'cannot have two entries with same name and url'}
  ...
end
4

1 に答える 1

1

私は両方を使用します。

一意のインデックスを使用する利点は、データベースでもそれが適用されることです。たとえば、それぞれが新しいレコードを作成する可能性のある6つのアプリケーションサーバーがある場合、レールで一意性を保護することは、問題を過小評価することは非常に困難です. 欠点は、これを元に戻すのが難しいことです。

アクティブ レコードで実行する利点は、簡単にデバッグできること、クリーンな例外メッセージを取得できること、問題をより効果的にユーザーに伝えることができることです。欠点は、追加のクエリが必要であり、マルチスレッド/マルチプロセス タイプのエラーに対して脆弱であることです。

両方とも、データベースの一意のインデックスの絶対的な信頼性と組み合わせることができる場合、アクティブ レコード検証の回復可能性が得られます。2 つのリクエストがまったく同時にヒットしたまれなインスタンスで別のエラーが表示されることがありますが、データは制約に合わせてインラインに保たれます。

于 2012-05-31T21:10:40.923 に答える