前提・実現したいこと
勉強でミニアプリを作成しています。
ユーザー管理にdeviseというgemを使用していて、
そのテーブル名をカスタマイズしています。
devise導入の記事など見てると、だいたいusersテーブルで作成してまして、
違う名前で作って見ようと思ったので試してます。
例えば、ownersや、artistsのようなテーブルを作る機会があった時に、
ちゃんとできるのかな?というロケハンです。
その際にマイグレートでコケたので、何が原因なのか、
テーブル名をカスタマイズしたことある方で、気をつける点などあれば聞きたいです。
発生している問題・エラーメッセージ
とりあえず「dog」でファイルを作成してみました。
console
1$ rails g devise dog 2Running via Spring preloader in process 9051 3 invoke active_record 4 create db/migrate/20200311102746_devise_create_dogs.rb 5 create app/models/dog.rb 6 invoke test_unit 7 create test/models/dog_test.rb 8 create test/fixtures/dogs.yml 9 insert app/models/dog.rb 10 route devise_for :dogs
ここは問題なく作成されました。
これを$ rake db:migrate
すると、下記のようにコケます。
console
1$ rake db:migrate 2== 20200311102746 DeviseCreateDogs: migrating ================================= 3-- create_table(:dogs) 4 -> 0.0141s 5-- add_index(:dogs, :email, {:unique=>true}) 6rake aborted! 7StandardError: An error has occurred, all later migrations canceled: 8 9Mysql2::Error: Specified key was too long; max key length is 767 bytes 10/Users/okakaori/projects/devise_test/db/migrate/20200311102746_devise_create_dogs.rb:40:in `change' 11 12Caused by: 13ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes 14/Users/okakaori/projects/devise_test/db/migrate/20200311102746_devise_create_dogs.rb:40:in `change' 15 16Caused by: 17Mysql2::Error: Specified key was too long; max key length is 767 bytes 18/Users/okakaori/projects/devise_test/db/migrate/20200311102746_devise_create_dogs.rb:40:in `change' 19Tasks: TOP => db:migrate 20(See full trace by running task with --trace)
試したこと
DBを確認したところ、dogsテーブルが作成されていましたが、
$ rake db:migrate:status
で確認すると、当該マイグレートファイルがdownでした。
add_index
あたりでコケているので、
$ rake db:drop
→$ rake db:create
して仕切り直しし、
試しにindexを貼っている記述の部分をコメントアウトして
$ rake db:migrate
してみたら問題なく、マイグレートされました。
修正したmigrateファイルは下記です。
rb
1# 20200311102746_devise_create_dogs.rb 2# frozen_string_literal: true 3 4class DeviseCreateDogs < ActiveRecord::Migration[6.0] 5 def change 6 create_table :dogs do |t| 7 ## Database authenticatable 8 t.string :name 9 t.string :email, null: false, default: "" 10 t.string :encrypted_password, null: false, default: "" 11 12 ## Recoverable 13 t.string :reset_password_token 14 t.datetime :reset_password_sent_at 15 16 ## Rememberable 17 t.datetime :remember_created_at 18 19 ## Trackable 20 # t.integer :sign_in_count, default: 0, null: false 21 # t.datetime :current_sign_in_at 22 # t.datetime :last_sign_in_at 23 # t.string :current_sign_in_ip 24 # t.string :last_sign_in_ip 25 26 ## Confirmable 27 # t.string :confirmation_token 28 # t.datetime :confirmed_at 29 # t.datetime :confirmation_sent_at 30 # t.string :unconfirmed_email # Only if using reconfirmable 31 32 ## Lockable 33 # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts 34 # t.string :unlock_token # Only if unlock strategy is :email or :both 35 # t.datetime :locked_at 36 37 38 t.timestamps null: false 39 end 40 41 # add_index :dogs, :email, unique: true ←これをコメントアウト 42 # add_index :dogs, :reset_password_token, unique: true ←これをコメントアウト 43 # add_index :dogs, :confirmation_token, unique: true 44 # add_index :dogs, :unlock_token, unique: true 45 end 46end
なぜ、add_indexの箇所でコケたのでしょうか。
deviseを使用したユーザー管理で、テーブル名をカスタマイズしたことある方、
わかる方いたら教えていただきたく。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。