Techioz Blog

Ransack を使用した Enum フィールドの検索

概要

列挙型フィールド「status」を持つテーブル「jobs」があります。 status には次の列挙型セットがあります。

enum status: [ :draft, :active, :archived ]

ransack を使用して、テーブルをフィルタリングして、たとえばすべてのアクティブなレコードを取得するにはどうすればよいですか?

解決策

次のようにモデル内で独自の ransacker を宣言できます。

ransacker :status, formatter: proc {|v| statuses[v]} do |parent|
  parent.table[:status]
end

次に、デフォルトの ransack 構文 _eq を使用して、次のように等価性を確認できます。

Model.ransack(status_eq: 'active').result

編集:列名が変更されない場合は、コードのブロックをスキップできます。

ransacker :status, formatter: proc {|v| statuses[v]}