У меня есть пример класса, который действует как правило, как показано ниже, и они будут больше правил в будущем. В этом случае он проверяет, является ли предмет страховкой, и если это так, то в игру вступает метод satisfied?
:
class ItemAvailabilityRule
def applicable?(item:)
item.name == Item::INSURANCE
end
def satisfied?(bookable:, item:)
applicable?(item) && bookable.duration_in_days < 365
end
end
У меня есть другой класс, который применяет правила к предметам, как показано ниже:
class ItemsAvailabilityPolicy
def initialize(rules: [])
@rules = rules
end
def apply(bookable:, items:)
items.map do |item|
applicable_rules = rules.select { |rule| rule&.applicable?(item: item) && rule&.applicable?(bookable: bookable, item: item) }
applicable_rules.detect { |rule| !rule.satisfied?(bookable: bookable, item: item) }
end
end
end
Мой метод применения не совсем правильный, я думаю ..
Что я хочу достичь с помощью этого метода применения, так это то, что для отдельного элемента, использующего это: applicable_rules = rules.select { |rule| rule.applicable?(item: item) }
даст мне все правила, которые применяются к этому пункту. Затем я хочу проверить, есть ли хотя бы одно неудовлетворенное правило, для которого я сделал: applicable_rules.detect { |rule| !rule.satisfied?(bookable: bookable, item: item) }
Затем я хочу удалить из массива элементы, которые не удовлетворяют всем применимым правилам, и возвращает массив с только те, которые удовлетворяют правилу .. Как я могу этого достичь?