はじめに
ransackのselectボックスでenumのi18nを使用する時に記載方法に迷ったのでメモを残します
理解していないとハマること
・enumを使用すると、実際にDBに保存されているのは対応づけられたinteger(数値)であること
・ransackはその数値に基づいて検索をかけていること
・selectボックスを検索条件に設定した時のHTML構造を理解すること
(valueの値がenumで設定した名前(文字列)になっていること)
<option value="0">男向け</option>
<option value="1">女向け</option>
<option value="2">その他</option>
ポイント
Admin.statuses_i18n.invert.map { |key, value| [key, Admin.statuses[value]] }
key・・・enumで設定した名前(文字列)
value・・・enumで対応づけられたinteger(数値)
間違えていたこと
ransackはenumを使用すると、実際にDBに保存されているのは対応づけられたinteger(数値)に基づいて検索をかけていることが抜けていました
Admin.statuses_i18n.invert
key・・・enumで設定した名前(日本語)
value・・・enumで設定した名前(英語)
上記だと数値で検索をかけられないので正常に機能しませんでした
実際に書いたコード
= search_form_for @search, url: xxx_path do |f|
= f.select :status_eq, Admin.statuses_i18n.invert.map { |key, value| [key, Admin.statuses[value]] }
admin.rb
enum status:{for_men: 0, for_women: 1, for_others: 2}
ja.yml
ja:
activerecord:
省略
enums:
admin:
status:
for_men: 男向け
for_women: 女向け
for_others: その他