Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 返回满足特定规则的项数组_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 返回满足特定规则的项数组

Ruby on rails 返回满足特定规则的项数组,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个示例类,它的作用类似于下面的规则,将来它们将成为更多的规则。在这种情况下,它会检查一个项目是否是一项保险,然后检查该项目是否满足要求?方法发挥作用: class ItemAvailabilityRule def applicable?(item:) item.name == Item::INSURANCE end def satisfied?(bookable:, item:) applicable?(item) && bookable.du

我有一个示例类,它的作用类似于下面的规则,将来它们将成为更多的规则。在这种情况下,它会检查一个项目是否是一项保险,然后检查该项目是否满足要求?方法发挥作用:

class ItemAvailabilityRule
  def applicable?(item:)
    item.name == Item::INSURANCE
  end

  def satisfied?(bookable:, item:)
    applicable?(item) && bookable.duration_in_days < 365
  end
end
我认为我的申请方法不太正确

我希望通过此应用方法实现的是,对于使用以下方法的单个项目: 适用的|规则=规则。选择{|规则|规则。适用的?项目:项目}将为我提供适用于该项目的所有规则。 然后我想检查是否至少有一条未满足的规则 为此,我: 适用的_rules.detect{| rule |!rule.safected?可预订:可预订,项目:项目}

然后,我想从数组中删除不满足所有适用规则的项,并返回一个仅包含满足规则的项的数组。。我怎样才能做到这一点呢?

你几乎做到了:

class ItemsAvailabilityPolicy
  def initialize(rules: [])
    @rules = rules
  end

  def apply(bookable:, items:)
    items.select do |item|
      applicable_rules = rules.select { |rule| rule&.applicable?(item: item) && rule&.applicable?(bookable: bookable,
 item: item) }
      non_satisfactory = applicable_rules.detect { |rule| !rule.satisfied?(bookable: bookable, item: item) }
      non_satisfactory.blank?
    end
  end
end

更改是最小的,第一个要选择的更改映射,因此您只选择从块返回true的项。Enumerableselect需要从块中的每个项目返回真实或虚假的结果,因此我们使用blank?

如果我理解您的意思与Stefan的要求一样正确,您想返回满足所有适用规则的所有项目吗?您有一个可预订对象,您希望对集合中的所有项进行测试。这假设每个规则将以相同的方式应用,即使用相同的变量等

您不需要在这里使用任何局部变量,因为Arrayselect是项目所需的,您可以对适用的规则再次使用select,并将其与Arrayall链接?为确保您可能选择的项目通过所有适用规则

这里的代码比解释更容易理解

class ItemsAvailabilityPolicy
  def initialize(rules: [])
    @rules = rules
  end

  def apply(bookable:, items:)
    items.select do |item|
      @rules.select { |rule| rule.applicable?(item: item) }.all? do |rule|
        rule.satisfied?(bookable: bookable, item: item)
      end
    end
  end
end
注意:我使用@rules是因为您使用了实例变量,而没有使用attr\u读取器或attr\u访问器


希望这对您有所帮助

,您想选择符合所有适用规则的项目吗?
class ItemsAvailabilityPolicy
  def initialize(rules: [])
    @rules = rules
  end

  def apply(bookable:, items:)
    items.select do |item|
      @rules.select { |rule| rule.applicable?(item: item) }.all? do |rule|
        rule.satisfied?(bookable: bookable, item: item)
      end
    end
  end
end