RansackはRailsのenumに対応していないっぽい

Railsでenumを定義していれば、対応するintegerでもstringでも検索ができます。

MailMagazine.where(status: 'sent')
MailMagazine.where(status: 1)

しかしransackで`status_eq’を使って文字列を渡すと,必ず0が渡って正しく検索されないようです。

pry(main)> MailMagazine.search(status_eq: 'sent').result
MailMagazine Load (0.2ms)  SELECT "mail_magazines".* FROM "mail_magazines" WHERE "mail_magazines"."status" = 0
=> []

なので、enum_helpを使ってselectするときにネストした配列の2番目の要素がintegerになるような処理を書いてみました。

GitHub – zmbacker/enum_help: Help ActiveRecord::Enum feature to work fine with I18n and simple_form.

[8] pry(main)> MailMagazine.statuses_i18n.invert
=> {"送信待ち"=>"draft", "送信中"=>"sending", "送信済"=>"sent"}
[9] pry(main)> MailMagazine.statuses_i18n.invert.map{|key,value| [key, MailMagazine.statuses[value]]}
=> [["送信待ち", 1], ["送信中", 2], ["送信済", 3]]

active adminを使っているのですが、ログやgemfileを見てみると、ransackを使っているようでした。filterでstringを渡していて、正しく検索されないので、上記のような処理を書いてみました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です