Techioz Blog

Devise 登録 Ruby on Rails - 移行エラー: 列名が重複しています

概要

Devise を Users テーブルに追加する Rails 移行の実行中に問題が発生しました。エラー メッセージは重複した列名、具体的には「email」を示しています。問題の原因となっている移行ファイルは、/Users/jaydenthelwell/pye-candles/pye-candles/db/merge/20231115201715_add_devise_to_users.rb にあります。

エラーは次のとおりです。

エラーは次のとおりです。

SQLite3::SQLException: 重複した列名: 電子メール /Users/jaydenthelwell/pye-candles/pye-candles/db/maigrate/20231115201715_add_devise_to_users.rb:7:in block in up’ /Users/jaydenthelwell/pye-candles/pye-candles/db/merge/20231115201715_add_devise_to_users.rb:5 :アップ中’

のせいで: ActiveRecord::StatementInvalid: SQLite3::SQLException: 重複した列名: 電子メール /Users/jaydenthelwell/pye-candles/pye-candles/db/maigrate/20231115201715_add_devise_to_users.rb:7:in block in up’ /Users/jaydenthelwell/pye-candles/pye-candles/db/merge/20231115201715_add_devise_to_users.rb:5 :アップ中’

のせいで: ActiveRecord::StatementInvalid: SQLite3::SQLException: 重複した列名: 電子メール /Users/jaydenthelwell/pye-candles/pye-candles/db/maigrate/20231115201715_add_devise_to_users.rb:7:in block in up’ /Users/jaydenthelwell/pye-candles/pye-candles/db/merge/20231115201715_add_devise_to_users.rb:5 :アップ中’

関連する移行ファイルは次のとおりです。

関連する移行ファイルは次のとおりです。

class AddDeviseToUsers < ActiveRecord::Migration[7.0] デフセルフアップ change_table :ユーザーは |t| を実行します ## データベース認証可能 t.string :電子メール、null: false、デフォルト: “” t.string :encrypted_password、null: false、デフォルト: “”

  ## Recoverable
  t.string   :reset_password_token
  t.datetime :reset_password_sent_at

  ## Rememberable
  t.datetime :remember_created_at

  ## Trackable
  # t.integer  :sign_in_count, default: 0, null: false
  # t.datetime :current_sign_in_at
  # t.datetime :last_sign_in_at
  # t.string   :current_sign_in_ip
  # t.string   :last_sign_in_ip

  ## Confirmable
  # t.string   :confirmation_token
  # t.datetime :confirmed_at
  # t.datetime :confirmation_sent_at
  # t.string   :unconfirmed_email # Only if using reconfirmable

  ## Lockable
  # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
  # t.string   :unlock_token # Only if unlock strategy is :email or :both
  # t.datetime :locked_at


  # Uncomment below if timestamps were not included in your original model.
  # t.timestamps null: false
end

add_index :users, :email,                unique: true
add_index :users, :reset_password_token, unique: true
# add_index :users, :confirmation_token,   unique: true
# add_index :users, :unlock_token,         unique: true

終わり

デフセルフダウン # デフォルトでは、移行をロールバックする方法については何も想定しません。 # モデルはすでに存在します。この移行で削除するフィールドを以下で編集してください。 ActiveRecord::IreversibleMigration を発生させる 終わり 終わり

デフセルフダウン # デフォルトでは、移行をロールバックする方法については何も想定しません。 # モデルはすでに存在します。この移行で削除するフィールドを以下で編集してください。 ActiveRecord::IreversibleMigration を発生させる 終わり 終わり

これが問題の原因だと思い、ユーザー移行ファイルを削除しました。ユーザーテーブルにも「電子メール」がありますが、問題は解決しません。

解決策

SQLite3::SQLException: 重複した列名: 電子メール エラーが発生した後、create_users 移行ファイルを再度見直しました。この問題は、Devise が追加しようとしていた列が元の移行にすでに存在していたために発生しました。

これを解決するために、次のように移行で users テーブルを再作成しました。

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      # t.string :email, null: false, default: ""
      # t.string :encrypted_password, null: false, default: ""
      # t.string :reset_password_token
      # t.datetime :reset_password_sent_at
      # t.datetime :remember_created_at
      t.string :first_name
      t.string :second_name
      t.date :d_o_b
      t.string :phone_number
      t.string :address

      ## Other Devise fields if needed

      t.timestamps null: false
    end

    add_index :users, :email, unique: true
    add_index :users, :reset_password_token, unique: true
    # Add other indexes if needed
  end
end

ただしコメントアウトされている

  # t.string :email, null: false, default: ""
  # t.string :encrypted_password, null: false, default: ""
  # t.string :reset_password_token
  # t.datetime :reset_password_sent_at
  # t.datetime :remember_created_at

Devise が追加しようとしていた列 (電子メール、encrypted_password など) は、元の移行に既に含まれていたため、コメント アウトしました。この調整を行った後、移行は問題なく正常に実行されました。