ユーザーが自分の記事に対して任意のカテゴリーを付与できる機能を実装しようとしたときの話。
モデルのバリデーション(:case_sensitive)は大文字小文字を区別しない設定(デフォルト)。
そしてtwitterというカテゴリーが既に登録してある状態でTwitterというカテゴリを登録しようとした際にエラーが発生しました。
どうやらMySQLはデフォルトだと文字列の大文字小文字を区別しない模様。
自分の実装している内容的には区別した上でDBに登録しておきたいので、何とかしたい。
Railsにおいて既存のカラムに大文字小文字を区別させる具体的な手順が見当たりませんでしたので、備忘録として残しておきます。
手順
マイグレーションを生成します。命名規則については今回のケースに合致するものが見つからなかったため、参考までに。
rails g migration ChangeCollationForCategoryNames
大文字小文字を区別させるためには対象のカラムにBINARY属性を付与する必要があるのですが、Railsにそれを実現するメソッドが見当たらなかったため、executeで直接実行させます。
XXXXXXXXXXXXXX_change_collation_for_category_names.rb
class ChangeCollationForCategoryNames < ActiveRecord::Migration[5.0]
def up
execute("ALTER TABLE categories MODIFY name varchar(255) BINARY")
end
end
マイグレーションを実施すれば完了です。
rake db:migrate
まとめ
DBによってこのような挙動の違いがあるのは結構怖いですね。
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。