Поиск в поле Enum с помощью Ransack

У меня есть таблица «Работа» с полем перечисления «Статус». status имеет следующий набор перечислений:

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

используя ransack, как мне отфильтровать таблицу, скажем, по всем активным записям?


person Will    schedule 16.05.2016    source источник
comment
Пожалуйста, напишите, что вы пробовали до сих пор.   -  person floum    schedule 16.05.2016


Ответы (2)


Вы можете объявить собственного вымогателя в модели следующим образом:

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

Затем вы можете использовать синтаксис поиска по умолчанию _eq для проверки равенства следующим образом:

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

Изменить: если имя столбца не меняется, вы можете пропустить блок кода:

ransacker :status, formatter: proc {|v| statuses[v]}
person qarol    schedule 16.05.2016
comment
Спасибо. это работает, но похоже, что я мог бы просто использовать значение параметра и выполнять обычный поиск. код читается немного лучше/простее таким образом. Добавление фильтра в ActiveAdmin работало без создания вымогателя, хотя они используют Ransack для фильтрации. Кажется странным, что это не сработало на переднем конце так же легко. - person Will; 19.05.2016
comment
@Will Да, вы можете использовать просто область видимости. Это должно работать нормально :) Но проблема возникает, когда вы не можете пропустить использование ransack. Без кода, упомянутого выше, он всегда будет преобразовывать параметр active в целое число .to_i, поэтому вы всегда будете получать 0 вместо правильного значения. - person qarol; 19.05.2016

Это то, что я использую в своих представлениях для перечислений и поиска:

<%= f.select :status_eq, Model.statuses.to_a.map { |w| [w[0].humanize, w[1]] },
                         {:include_blank => true} %>
person Andrew Cetinic    schedule 16.06.2016
comment
Таким образом, получается, что вы должны передать целочисленное значение атрибута в хэш q, поскольку ransack не будет выполнять за вас диалог enum. - person Donato; 23.12.2016
comment
Любая идея, как сделать это как radio_buttons? - person Yshmarov; 16.12.2018