Как фильтровать значение NULL в ActiveAdmin?

У меня есть таблица с целочисленным столбцом под названием "map_id", я хочу добавить фильтр activeadmin для фильтрации, если этот столбец равен NULL или не равен NULL.

Как это можно реализовать ?

я попробовал следующий фильтр

filter :map_id, :label => 'Assigned', :as => :select, :collection => {:true => nil, :false => ''}

но, я получаю следующее сообщение об ошибке :

неопределенный метод `map_eq' для #

5 ответов


не нашел хорошего решения, но вот как. фильтры Active_admin выполняются meta_search, вы можете переопределить функции, автоматически генерируемые meta_search в вашей модели, чтобы получить поведение, которое вы хотите, лучший способ-использовать область, так как вам нужно вернуть отношение для цепочки с другими запросами/областями, как указано здесь

в вашей модели:

для: as=>: выберите фильтры, acitve_admin используйте _eq where, вот исходный код

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.

надеюсь, что это поможет.


Если кто-то происходит в этом потоке с опозданием, теперь есть простой способ фильтровать для null или non null в active admin:

filter :attribute_present, :as => :boolean 
filter :attribute_blank,   :as => :boolean  

для этого больше не нужно добавлять пользовательский метод в область.


Кажется, 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

вы увидите кнопки для этих областей (в верхнем разделе, под именем модели, а не в разделе фильтра)


новая версия 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 записи.

этой теме помогли большое.


С ransackable областями:

в определении ресурса ActiveAdmin:

filter :map_id, :label => 'Assigned', as: :select, :collection => [['Is Null', 'none'], ['Not null', 'present']]

модели:

scope :by_map_id, ->(id) { (id == 'none' ? where(map_id: nil) : where('map_id IS NOT NULL')) }

def self.ransackable_scopes(_auth_object = nil)
  %i[by_map_id]
end