2017-08-22 13 views
3

私はRails 5とPostgreSQL 9.5を使用しています。テーブル内に一意のインデックスを作成するにはどうすればよいですか?私は他のテーブルへの参照である2つの列から一意のインデックスを作成したいと思います。だから私はRails create table migration内でユニークなインデックスを作成するにはどうすればよいですか?

class CreateUserNotificationsTable < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user_notifications do |t| 
     t.references :users, index: true, on_delete: :cascade 
     t.references :crypto_currencies, index: true, on_delete: :cascade 
     t.integer "price",  null: false 
     t.boolean "buy",  null: false 
     t.index [:user_id, :crypto_currency_id], unique: true 
    end 
    end 
end 

を試してみましたが、私はエラーに

PG::UndefinedColumn: ERROR: column "user_id" does not exist 
: CREATE UNIQUE INDEX "index_user_notifications_on_user_id_and_crypto_currency_id" ON "user_notifications" ("user_id", "crypto_currency_id") 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activerecord-5.0.4/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activerecord-5.0.4/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute' 
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activerecord-5.0.4/lib/active_record/connection_adapters/abstract_adapter.rb:590:in `block in log' 

を取得していcreate table文の中に一意のインデックスを作成するための正しい方法は何ですか?あなたの移行がそのようにする必要がありますので

+0

あなたは 'user_id'列がuser_notifications'テーブル'に固執していますか? 'UserNotification.column_names'で確認してください – Pavan

+0

私はあなたの質問を理解していません。私はこの "t.references:users、index:true、on_delete::cascade"を "create table"の直下に置いていますので、 "user_id"カラムを作成しないでください。 – Dave

+0

上記の移行を実行すると失敗し、user_notificationsテーブルは作成されません。 "create_table(:user_notifications)"の後に "rake aborted!StandardError:エラーが発生しました。これ以降のすべての移行はキャンセルされました:"と、上記のエラーが続きます。 – Dave

答えて

7

PG::UndefinedColumn: ERROR: column "user_id" does not exist

すると、カラムのuser_idusers_idないと呼ば作成し、それができないのインデックスを作成しますt.index [:user_id, :crypto_currency_id], unique: trueが列user_idとして作成されていないため、そのエラーが発生します。

ソリューション:

だけt.references :userに変更します。 t.references :crypto_currenciesでも同じです。

class CreateUserNotificationsTable < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user_notifications do |t| 
     t.references :user, index: true, on_delete: :cascade 
     t.references :crypto_currency, index: true, on_delete: :cascade 
     t.integer "price",  null: false 
     t.boolean "buy",  null: false 
     t.index [:user_id, :crypto_currency_id], unique: true 
    end 
    end 
end 
-3

インデックス名が複数のIDのためになるべきである:問題がt.references :usersある

class CreateUserNotificationsTable < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user_notifications do |t| 
     t.references :users, index: true, on_delete: :cascade 
     t.references :crypto_currencies, index: true, on_delete: :cascade 
     t.integer "price",  null: false 
     t.boolean "buy",  null: false 
     # users_id instead of user_id 
     t.index [:users_id, :crypto_currencies_id], unique: true 
    end 
    end 
end 
0

のように、create_table方法のインデックスを抽出するようにしてください:

class CreateUserNotificationsTable < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user_notifications do |t| 
     t.references :users, index: true, on_delete: :cascade 
     t.references :crypto_currencies, index: true, on_delete: :cascade 
     t.integer "price",  null: false 
     t.boolean "buy",  null: false 
    end 

    add_index :user_notifications, [:user_id, :crypto_currencies_id], unique: true 
    end 
end 
+0

テーブルを作成して、テーブル作成ブロック内に一意のインデックス定義を含めることは不可能ですか? – Dave

関連する問題