Как фильтровать 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.

Этот поток помог много.