Как отфильтровать неактивные электронные письма из массива электронных писем в приложении rails?

#ruby-on-rails #ruby #ruby-on-rails-4

Вопрос:

В настоящее время я работаю над билетом, в котором меня просят отфильтровать любое неактивное электронное письмо, которое будет отправлено получателю. Вот метод, над которым я работаю:

 def self.delivering_email(message)
    return if email_to_be_delivered?(message.subject)
    
    email_list = message.to
    if email_list.is_a?(String)
      email_list = email_list.split(",").map(amp;:strip)
    end

    email_list.each { |email| 
      identity = Identity.find_by(email: email)
      next if identity.nil?
      # email_list.delete(email) unless identity.try(:preferred_user).active?
      email_list.select(email) if identity.try(:preferred_user).active?
    }
    
    message.to = email_list
    message.perform_deliveries = !email_list.empty?
  end

 

«# список адресов электронной почты.удалить(по электронной почте) , если identity.try(:предпочтительный пользователь).активен?» Я прокомментировал это, потому что контроль качества упомянул, что ТОЛЬКО одно неактивное электронное письмо отфильтровывается и не полностью фильтрует другие неактивные электронные письма в массиве. Я предположил, что вместо .delete я должен использовать .выберите, но не знаю, работает ли это, потому что у меня нет никакого способа проверить и воспроизвести ошибку с моей стороны или как ее правильно реализовать.

Любая помощь будет оценена по достоинству.

Ответ №1:

Вы пытаетесь изменить массив во время итерации по нему, что может привести к странному поведению. Один из вариантов — просто использовать отдельный массив.

Поскольку вы уже выполняете итерацию, email_list.each вы можете позвонить next , если текущий email результат вас не удовлетворяет, как вы уже делаете для identity.nil? .

Так что это может выглядеть примерно так

 valid_emails = []
email_list.each { |email|
  identity = Identity.find_by(email: email)
  next if identity.nil? || !identity.try(:preferred_user).active?
  valid_emails << email
end


message.to = valid_emails