14

1 つの列を持つ単純な MySQL テーブルがあります: name.

この列に一意の制約を定義したいと思います。

できます:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

ただし、データベース レベルではなく、アプリケーション レベルでのみ機能します。

あなたは何を提案しますか?

4

2 に答える 2

33

以下を使用して、データベース自体に一意の制約を追加します。

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
于 2012-07-02T16:54:44.740 に答える
5

これはあまり役に立ちませんが、データベース レベルで一意性を強制するための優れた答えはないようです。Rails移行ガイドから:

アクティブ レコードの方法では、インテリジェンスはデータベースではなくモデルに属していると主張します。そのため、そのインテリジェンスの一部をデータベースに戻すトリガーや外部キー制約などの機能は、あまり使用されていません。

validates_uniqueness_of などの検証は、モデルがデータの整合性を確保できる 1 つの方法です。

Active Record はそのような機能を直接操作するためのツールを提供していませんが、execute メソッドを使用して任意の SQL を実行できます。

データベースの一意性を本当に強化したい場合は、ActiveRecord execute メソッドを使用して SQL コマンドを自分で実行するのが最善の方法のようです。

于 2010-12-10T04:02:10.537 に答える