1 つの列を持つ単純な MySQL テーブルがあります: name
.
この列に一意の制約を定義したいと思います。
できます:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :my_column_name
end
ただし、データベース レベルではなく、アプリケーション レベルでのみ機能します。
あなたは何を提案しますか?
1 つの列を持つ単純な MySQL テーブルがあります: name
.
この列に一意の制約を定義したいと思います。
できます:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :my_column_name
end
ただし、データベース レベルではなく、アプリケーション レベルでのみ機能します。
あなたは何を提案しますか?
以下を使用して、データベース自体に一意の制約を追加します。
add_index :my_models, :my_column_name, unique: true
...移行を通じて (そして、 my_column_name が null 値も受け入れないようにしたい場合があります:
class CreateMyModels < ActiveRecord::Migration
def change
create_table :my_models do |t|
t.string :my_column_name, null: false
t.timestamps
end
add_index :my_models, :my_column_name, unique: true
end
end
これはあまり役に立ちませんが、データベース レベルで一意性を強制するための優れた答えはないようです。Rails移行ガイドから:
アクティブ レコードの方法では、インテリジェンスはデータベースではなくモデルに属していると主張します。そのため、そのインテリジェンスの一部をデータベースに戻すトリガーや外部キー制約などの機能は、あまり使用されていません。
validates_uniqueness_of などの検証は、モデルがデータの整合性を確保できる 1 つの方法です。
Active Record はそのような機能を直接操作するためのツールを提供していませんが、execute メソッドを使用して任意の SQL を実行できます。
データベースの一意性を本当に強化したい場合は、ActiveRecord execute メソッドを使用して SQL コマンドを自分で実行するのが最善の方法のようです。