Rails类别 - 检查用户类别是否与类别数组相交

时间:2016-04-21 14:40:38

标签: ruby-on-rails arrays

我在理解正确的解决方法方面遇到了一些麻烦。

  • 用户可以订阅类别(共8个)
  • 属性属于类别
  • 可以创建票证。门票可以有一个或多个属性。
  • 如果创建了故障单,并且用户订阅了某个类别,并且所创建的故障单包含该属性,则该用户将收到电子邮件通知。

这是我最初的。我认为它工作正常,但问题是:

如果创建的故障单具有跨越不同类别的多个属性,并且用户只订阅了其中一个类别,他们将无法收到该电子邮件。他们应该收到一封电子邮件。

示例:

  • 用户A仅订阅了一个类别:第一类。
  • 使用3个属性创建故障单。
  • 属性1来自类别1,属性2来自类别2,属性3来自类别3.
  • 由于用户A只订阅了第一类,因此他们不会收到票证,但是:因此我的代码存在问题。

我知道下面的内容很糟糕,因为这只会将最终的property.category.name放入@ticket_category

@ticket.properties.each do |property|
    @ticket_category = property.category.name
end


@people_for_email = @sub_emails.select {|user| user["categories"].include?(@ticket_category)}

@emails_for_email = @people_for_email.map {|emails| emails["name"]}

然后我们发送电子邮件

UserNotifier.ticket_created(@emails_for_email).deliver_now

我已尝试将@ticket_category设置为数组[]并在块中使用<<。使用.any?似乎在这里工作得很好,但是我没有运气很多而没有返回参数错误。知道最好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用&来获取两个数组的交集。如果数组中有任何元素,则present?将返回true。如下所示:

@ticket_categories = []
@ticket.properties.each do |property|
    @ticket_categories << property.category.name
end


@people_for_email = @sub_emails.select do |user|
  intersection = user["categories"] & @ticket_categories
  intersection.present?
end

@emails_for_email = @people_for_email.map {|emails| emails["name"]}

(我没有对此进行测试,因此可能存在拼写错误)