Как фильтровать IS NULL в ActiveAdmin?
У меня есть таблица с целым столбцом с именем "map_id", я хочу добавить фильтр activeadmin для фильтрации, если этот столбец IS NULL или IS NOT NULL.
Как это можно реализовать?
Я попробовал следующий фильтр
filter :map_id, :label => 'Assigned', :as => :select, :collection => {:true => nil, :false => ''}
Но я получаю следующее сообщение об ошибке:
undefined метод `map_eq 'для #
Ответы
Ответ 1
Не найдено хорошего решения, но вот как.
фильтры Active_admin выполняются с помощью meta_search, вы можете переопределить функции, автоматически созданные meta_search в вашей модели, чтобы получить нужное поведение, лучший способ - использовать область действия, так как вам нужно вернуть отношение, чтобы связать с другим запросом /scopes, как указано здесь
в вашей модели:
для: as = > : выбрать фильтры, acitve_admin использовать _eq wheres, вот исходный код
scope :map_eq,
lambda{ |id|
if(id !='none')
where( :map_id=> id)
else
where( :map_id=> nil)
end
}
#re-define the search method:
search_method :map_eq, :type => :integer
в вашем блоке регистров ative_admin:
filter :map_id, :label => 'Assigned', :as => :select, :collection => [['none', 'none'], ['one', 1],['tow', 2]]
# not using :none=>nil because active_admin will igore your nil value so your self-defined scope will never get chained.
Надеюсь на эту помощь.
Ответ 2
Если кто-то происходит в этой ветке с запозданием, теперь есть простой способ фильтрации для нулевого или не нулевого в активном admin:
filter :attribute_present, :as => :boolean
filter :attribute_blank, :as => :boolean
Теперь больше не нужно добавлять в область пользовательский метод, чтобы выполнить это.
Ответ 3
похоже, что search_method не работает в последней версии rails, вот еще одно решение:
добавить область к вашей модели:
scope :field_blank, -> { where "field is null" }
scope :field_not_blank, -> { where "field is not null" }
добавить/app/admin/[ВАША МОДЕЛЬ]
scope :field_blank
scope :field_not_blank
вы увидите кнопки для этих областей (в верхней части, под именем модели, а не в разделе фильтра)
Ответ 4
В новой версии ActiveAdmin используется Ransacker. Мне удалось заставить его работать следующим образом:
В admin
filter :non_nil_map_id, :label => 'Assigned', :as => :select, :collection => [['none', 'none'], ['one', 1],['tow', 2]]
Для согласованности я взял тот же код из ответа @Gret, просто изменив имя фильтра
На вашей модели
ransacker :not_nil_map_id, :formatter => proc {|id| map_id != 'none' ? id : 'none' } do |parent|
parent.table[:id]
end
Это должно инициировать поиск против nil в случае, если id является "none", а активная запись вернет все записи идентификатора nil.
Этот поток помог много.