2016-04-07 19 views
0

以下のモデルレベルの一意性制約があり、MySQLレベルに移行する必要があります。同じことをするSQL文は何ですか?条件付き一意性制約Ruby on rails

class Blog < ActiveRecord::Base 
    validate :uniqness_of_title 

    def uniqness_of_title 
     blog = Blog.where("title=? and lock_version<>-1", self.title).last 
     self.errors.add :base, "Title already exists." if blog 
    end 
end 

とそれはタイトルがすでにレコードがlock_versionを持って存在していても、「ブログ」テーブルにエントリを作成できるようにする必要があります= -1。

答えて

0
ALTER TABLE blogs ADD CONSTRAINT uc_title UNIQUE (title) 
+0

私はlock_version列も検証する必要があります。ブログのタイトルがlock_version = -1で存在する場合。それはエントリーすることを許すべきです。 –

+1

私はあなたがmysqlの制約(http://stackoverflow.com/questions/987099/unique-constraint-with-conditions-in-mysqlによってバックアップされている意見)でそれを行うことはできないと思います。個人的には、このようなビジネスロジック条件をモデルに残します。 – born4new

+0

@ born4new一意性はデータベースによってのみ保証されます。 3つのRailsアプリケーションサーバーを使用している場合は、3つのモデルレベルのチェックを同時に実行し、そのタイトルを持つ既存のものを見つけられず、すべてが新しいタイトルを作成します。 MySQLでこれを行う最良の方法は別の質問です。 –