Ruby класс, который может принимать массив правил - PullRequest
1 голос
/ 09 января 2020

Я нахожусь в процессе изучения Ruby / Rails. В настоящее время я учусь создавать модель / классы.

У меня есть существующий класс с этими методами

  def duration
    (start_on..end_on).count
  end

  def items
    space.available_items
  end

  def available_items
    duration >= 365 ? items.not_including_insurance : items
  end

В приведенном выше классе у меня есть метод с именем available_items, который проверяет, превышает ли продолжительность 365 дней, затем элемент не будет включен в массив.

Вместо того, чтобы связывать лог продолжительности c с существующим классом, я думаю, что лучше инкапсулировать его в другой класс, который может принять массив правил для применения к элементам.

Итак вместо этого в вышеприведенном классе в методе available_items я могу сделать что-то вроде:

policy.apply(items)

, который вернет все элементы, которые удовлетворяют правилам. И в будущем я могу добавлять больше правил и сохранять их гибкость.

1 Ответ

1 голос
/ 09 января 2020

После include в вашем модуле вы все еще можете определить метод available_items с пользовательскими правилами (и иметь c один восходящий поток), это простой способ.

Что касается "прохождения" Параметры стратегии - это может быть выполнено в Концерне, например:

module SomePolicy
  extend ActiveSupport::Concern

  module ClassMethods
    def my_policiable(param)
      has_many :prices, class_name: 'Pricing::SimplePrice', as: :priceable
      # ...
      define_method(:available_items) {
        if param == :foo
          # ...
        end
      }
    end
  end
end
include SomePolicy

my_policiable(:foo)

Хитрость заключается в том, что метод запускается в контексте класса, там на основе параметров вы можете определять методы по-разному (но обратите внимание, что в приведенном выше примере if param.. будет выполняться для каждого результирующего вызова метода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...