ruby on rails 3 - ¿Cómo filtrar es nulo en ActiveAdmin?
ruby-on-rails-3 formtastic (5)
Con alcances de saqueo:
En la definición de recurso ActiveAdmin:
filter :map_id, :label => ''Assigned'', as: :select, :collection => [[''Is Null'', ''none''], [''Not null'', ''present'']]
En tu modelo:
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
Tengo una tabla con una columna entera llamada "map_id", quiero agregar un filtro activeadmin para filtrar si esta columna es NULA o NO ES NULA.
¿Cómo se podría implementar esto?
Probé el siguiente filtro.
filter :map_id, :label => ''Assigned'', :as => :select, :collection => {:true => nil, :false => ''''}
Pero, me sale el siguiente mensaje de error:
método indefinido `map_eq ''para #
La nueva versión de ActiveAdmin usa Ransacker. Me las arreglo para que funcione de esta manera:
En el administrador
filter :non_nil_map_id, :label => ''Assigned'', :as => :select, :collection => [[''none'', ''none''], [''one'', 1],[''tow'', 2]]
Por coherencia, tomé el mismo código de @Gret answer simplemente cambiando el nombre del filtro
En tu modelo
ransacker :not_nil_map_id, :formatter => proc {|id| map_id != ''none'' ? id : ''none'' } do |parent|
parent.table[:id]
end
Esto debería desencadenar una búsqueda en contra de nil en caso de que el id sea ''ninguno'', y el registro activo devolverá todas las entradas de nil id .
Este hilo ayudó mucho .
No encontré una buena solución pero aquí hay un cómo. los filtros de Active_admin se realizan mediante meta_search, puede anular las funciones generadas automáticamente por meta_search en su modelo para obtener el comportamiento que desea, la mejor manera es usar el ámbito, ya que necesita devolver una relación para poder encadenar con otra consulta / ámbitos, como se indica here
en tu modelo:
para: como =>: seleccionar filtros, acitve_admin usa _eq wheres, aquí está el código fuente
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
en su bloque de registro 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.
Espero que esto ayude.
Parece que search_method no funciona en la versión reciente de Rails, aquí hay otra solución:
añadir alcance a su modelo:
scope :field_blank, -> { where "field is null" }
scope :field_not_blank, -> { where "field is not null" }
agregar a / app / admin / [SU MODELO]
scope :field_blank
scope :field_not_blank
Verá que aparecen botones para estos ámbitos (en la sección superior, debajo del nombre del modelo, no en la sección de filtro)
Si alguien está ocurriendo con retraso en este hilo, ahora hay una manera fácil de filtrar por nulo o no nulo en el administrador activo:
filter :attribute_present, :as => :boolean
filter :attribute_blank, :as => :boolean
Ya no es necesario agregar un método personalizado al alcance para lograr esto.