Как фильтровать значение 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