1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubocopでRails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.

Posted at

はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

問題

indexを以下のように張った

staff_number.rb
def up
  add_index :staff_number, :employee_code
end

def down
  remove_index :staff_number, :employee_code
end

Rubocopを走らせたところ以下のエラーが発生した

Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.

エラーの内容をみるとインデックスをユニークにすると治りそうなのでユニークにしたが治らず

staff_number.rb
def up
  add_index :staff, :employee_code, unique: true
end

def down
  remove_index :staff, :employee_code
end

解決方法

エラーをよく見ると

validates :employee_code, presence: true, uniqueness: { scope: :staff }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

scopeのところで参照しているがそこにindexが張られていないことが原因であると気づいた。
そこで、stuff_numberとstuffモデルをつなぐ、stuff_idにindexを張る

stuff_number.rb
def up
  add_index :staff, [:employee_code,:staff_id] unique: true
end

def down
  remove_index :staff, [:employee_code, :staff_id]
end

これでうまくいった

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?