17
9

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 5 years have passed since last update.

ActiveRecordで、uniqueかつnilを許可

Last updated at Posted at 2016-01-05

背景

パスワードリセットの為に一意のtokenを生成して、
http://example.com/password_reset/#{token}みたいなURLにアクセスしてパスワードをリセットするというのをやりたかった。

user_info.rb
class UserInfo < ActiveRecord::Base
  belongs_to :user

  # <!--省略 -->
  validates :token, uniqueness: true
end

tokenは一意に定まるので、model層でのバリデーションは上記の様にやれば良いと踏んで実装したが、
今まで通っていたはずの別のテストが、通らなくなった。

原因

tokenは、ユーザーがパスワードをリセットしたいと望んだ時に初めて生成されるものなので、初期状態はnilである。

つまり、nilの状態を持ったユーザーがたくさん作成されると、nilというtokenの値を持ったデータが複数個作られるため、一意に定まってないじゃん!とActiveRecordが誤作動してしまうというのが原因(だと思う)。

mysqlではデフォルトでnilは無視されるので、どんなにnilの値を持ったユーザーがいても大丈夫なのだけれど、ActiveRecordではうまくいかなかった。

対処法

user_info.rb
class UserInfo < ActiveRecord::Base
  belongs_to :user

  # <!--省略 -->
  validates :token, uniqueness: true, allow_nil: true
end

allow_nil: trueを付け足して、明示的に教えてあげたらうまくいった。

17
9
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
17
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?