Слияние двух активных записей ассоциаций рельсов - PullRequest
0 голосов
/ 30 января 2020

Мы внедряем фильтры в 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 и сделать конкатенация строк. Но надеюсь, что это худший сценарий.

1 Ответ

0 голосов
/ 31 января 2020

Для достижения OR и AND между условиями фильтрации вы можете просто использовать arel table . Таблица Arel делает сложный запрос проще и проще.

Другим способом, вы все еще можете использовать Ransack . Я думаю это и это - это то, что вы хотите в ransack.

...