回答:
古いバージョンのRailsに対する短い回答(Rails 4+に関する他の回答を参照):
add_index :table_name, :column_name, unique: true
複数の列にインデックスを付けるには、単一の列名ではなく、列名の配列を渡します。
add_index :table_name, [:column_name_a, :column_name_b], unique: true
「インデックス名...が長すぎる」と表示された場合はname: "whatever"
、add_indexメソッドに追加して名前を短くできます。
きめ細かな制御のために、execute
直接SQLを実行する" "メソッドがあります。
それでおしまい!
通常の古いモデル検証の代わりとしてこれを行う場合は、それがどのように機能するかを確認してください。ユーザーへのエラー報告は、モデルレベルの検証がなければ、それほどうまくいきません。いつでも両方を行うことができます。
indexed columns are not unique
一意のインデックスを作成しようとすると、エラーをテーブル内のデータがすでに重複が含まれているので、それはあるかもしれません。重複するデータを削除して、もう一度移行を実行してください。
, :name => "whatever"
、add_index
メソッドに追加して名前を短くすることができます。
レールは移行add_index_to_table_name column_name:uniqを生成します
または
railsはマイグレーションadd_column_name_to_table_name column_name:string:uniq:indexを生成します
生成する
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
既存の列にインデックスを追加する場合は、add_column
行を削除またはコメント化するか、チェックを入れます
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
しない場合でも列を追加するのはばかげていますadd_column...
。
レールによるデフォルトのunique_key名が長すぎてDBがエラーをスローする可能性があるため、一意のキーの名前を追加する必要がある場合があります。
インデックスの名前を追加するには、name:
オプションを使用します。移行クエリは次のようになります-
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
詳細-http ://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
DB列に一意を追加するのに失敗した場合は、モデルにこの検証を追加して、フィールドが一意かどうかを確認します。
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
ここを参照してください 上記はテストのみを目的としています。@ Nateの提案に従ってDB列を変更してインデックスを追加してください
詳細については、インデックスを参照してください。