Как применить условие выбора к массиву, который удовлетворяет условию & &, указанному в фильтрах ha sh? - PullRequest
0 голосов
/ 30 января 2020

У меня есть заказ, который содержит несколько бронирований, и я пытаюсь применить условие выбора к бронированию, которое задает определенное условие, указанное в га sh следующим образом

{ status: 'confirmed',
  slot: '1 p.m. - 2 p.m.'}

Мне нужно сделать универсальная c функция, которая работает с бронированием для любого количества фильтров, удовлетворяющих условиям. В этом случае условие: {слот '13:00 - 14:00' и статус подтвержден}

Я сделал следующее функция для этого, но не смог выдать условия && из фильтров

def bookings_of(filters)
  self.bookings.select do  |booking|
   filters.map{ |key, value| booking.send(key) == value }
  end
end

Как мне это сделать?

Ответы [ 3 ]

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

Хотя вы можете применять все свои фильтры, используя send для отдельных объектов, вы, вероятно, выиграете, если ваша база данных выполнит эту работу, используя where.

ActiveRecord. Фильтры исходят из параметров запроса. Возможно, вы открываете дыру в безопасности вашего приложения, используя send или where.

Рассмотрите возможность использования подхода списков разрешений, когда вы создаете окончательный запрос в зависимости от всех заданных фильтров. :

def bookings_of(slot:, status:)
  query = bookings
  query = query.where(slot: slot) if slot
  if ["confirmed", "abandonned"].include?(status)
    query = query.where(status: status)
  end
  query
end
0 голосов
/ 30 января 2020
def bookings_of(filters)
 self.bookings.select do  |booking|
   filters.map{ |key, value| booking.send(key) == value }.inject(:and)
 end
end
0 голосов
/ 30 января 2020

Если вы действительно хотели сделать это в Ruby, вы могли бы сделать:

def bookings_of(filters)
  self.bookings.select do |booking|
    !!filters.map { |key, value| break if booking.send(key) != value }
  end
end

Использование break здесь приведет к сбою, как только один из фильтров не пройдет, и он использует тот факт, что nil ложно, в то время как массив верен.

Но вам, вероятно, следует просто использовать .where и вместо этого делать это в базе данных.

В этом случае вы можете сделать это за один вызов, объединив массив хэшей в один га sh:

bookings.where(filters.reduce({}, :merge))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...