filter - Filtro personalizado en los rieles ActiveAdmin usando el saqueo
ransack (0)
Creé un filtro activeadmin que tiene las siguientes opciones para filtrar los datos de la tabla en su menú desplegable.
Elección A
Opción B
Opción C
Elección D
Quiero agregar una quinta opción F que elegiría B o C (es decir, los resultados de B y C).
Elección A
Opción B
Opción C
Elección D
Elección F = B o C
Las opciones se almacenan en una tabla llamada Cupones en su campo de título (creé una fila que tiene la opción F). Hasta ahora, traté de emplear un saqueo para hacer el truco, sin estar muy seguro.
//app/admin/user.rb
filter :has_right_choice, label: ''Filter by the right choice'', collection: Coupon.all, as: :select
//app/models/user.rb
ransacker :has_right_choice, :formatter => ->(title) {
if (title == ''Choice F'')
Coupon.all.where("title = ''Choice B'' OR title = ''Choice C''")
else
Coupon.all
end
} do |parent|
parent.table[:id]
end
Pero mi solución no funciona. ¿Hay un mejor enfoque en lugar de un saqueo? Si no, ¿alguna sugerencia?
=============================================== ===================== EDITAR: solución
La opción A # permite decir que esta opción tiene id = 1 en la tabla de cupones
Elección B # id = 2
Elección C # id = 3
Choice D # id = 4
Elección F # id = 5
También digamos que la tabla de Usuarios tiene un campo choice_id que se refiere a la tabla de Opciones. Modificamos el código defectuoso de la siguiente manera:
//app/admin/user.rb
filter :choice_id_in, label: ''Filter by the right choice'', collection: Coupon.all, as: :select
//app/models/user.rb
ransacker :choice_id,
:formatter => -> (coupon_id) {
if (coupon_id == "5")
ids = User.all.where("choice_id = 3 OR choice_id = 4").map(&:id)
else
ids = User.where("choice_id = ?", coupon_id).map(&:id)
end
(ids.empty?) ? ids << 0: ids #activeadmin translates the queries into IN operator, may get syntax error if empty
# id = 0 is non-existent in Users as id >= 1
ids #maybe is not needed
} do |parent|
parent.table[:id]
end
Sugerencias para mejorar son bienvenidas. Gracias @berker por la guía.