Мы внедряем фильтры в ruby на рельсах, где фильтры могут сочетаться с условиями И / ИЛИ.
Для достижения ИЛИ между условиями фильтра
Фильтр 1 ИЛИ Фильтр 1 ИЛИ Фильтр 3 = Мы достигли этого с помощью рельсов или методом (https://blog.bigbinary.com/2016/05/30/rails-5-adds-or-support-in-active-record.html) путем объединения двух активных отношений записи с ИЛИ.
Например: условия фильтрации:
id is 1 or id is 2
Для этого:
Person.where(id: 1).or(Person.where(id: 2)
Будет произведен запрос: SELECT "people".* FROM "people" WHERE ("people"."id" = $1 OR "people"."id" = $2) [["id", 1], ["id", 2]]
Для достижения И между условиями фильтрации
Основной Проблема, с которой мы столкнулись, заключается в объединении фильтров с условием AND,
id is 1 AND id is 2
Мы пытались использовать метод слияния в рельсах , но с этим методом те же условия будут отменены последним условием. Обнаружил это также проблема с рельсами
Person.where(id:1).merge(Person.where(id:2))
# The first condition is overridden by second, if the same condition is on the same column.
Person Load (0.7ms) SELECT "people".* FROM "people" WHERE "people"."id" = $1 [["id", 2]]
Примечание: приведенный мною пример может показаться простым, но фильтр logi c действительно сложен, поэтому мы не можем просто соединять рельсы выходишь там.
((id is 1 or id is 2) AND (id is 10 or id is 20))
Так будет выглядеть простой фильтр. Здесь гораздо больше сложностей можно добавить. Наш фильтр будет выглядеть как ransack demo app .
Что мы будем делать, так это объединить все внутренние блоки с ИЛИ и объединить все внешние блоки с И. Может кто-нибудь предложить лучший подход, если условие фильтра - И, а столбец должен быть запрошен в том же столбце?
Заранее спасибо.
Мы также подумали, чтобы получить условия where и сделать конкатенация строк. Но надеюсь, что это худший сценарий.