enumerizeで検索select box
ransack
で検索フォームを作成する場合のenumerize
を利用したselect boxの作成について。
課題
enumerize
で検索用のselect boxを作成したいが options
メソッドだと、
> Product.kind.options => [["キット", "kit"], ["おもちゃ", "toy"]]
となってしまう、やりたいことは enumerize
の in
で指定したvalueを利用したい。
理想は、
[["キット", 1], ["おもちゃ", 2]]
としたい。
解決方法
locale
ja: enumerize: product: kind: kit: キット toy: おもちゃ
モデル
class Product < ApplicationRecord extend Enumerize enumerize :kind, in: { kit: 1, toy: 2 }, predicates: { prefix: true }, scope: true end
ヘルパー
module ProductsHelper def select_kinds Product.kind.find_values(*Product.kind.values.map(&:to_sym)).map { |kind| [kind.text, kind.value] } end end
view
<%= f.select(:kind_eq, select_kinds) %>
<select name="q[kind_eq]" id="q_kind_eq"> <option value="1">キット</option> <option value="2">おもちゃ</option> </select>
となる。
最後に
enumerize :kind, in: { kit: 1, toy: 2 }
の in で指定しているhashを定数にするという案もあるが、localeのこととかを考えると、この実装が良いと感じた。