发送包含delayed_job的简报

时间:2012-11-27 11:34:28

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 delayed-job

我有admin_mailer

class AdminMailer < ActionMailer::Base
 def send_message_to_all_users(user, subject, body, locale)
    @user = user
    @body = body
    @locale = locale
    mail(:to => user.email, :subject => subject)
  end
end

在我对控制器用户的操作中:

def send_email_to_all_users

   users = User.all
   subject = params[:subject]
   body = params[:body]
   locale = params[:locale]
   for user in users
    User.delay(queue: "Email", priority: 20).send_message_to_all_users(user, subject, body, locale)
   end

   respond_to do |format|
    .........
   end
end

在我的模型中User

class User
 include Mongoid::Document
 include Mongoid::Timestamps::Created
.
.
.

#delayed jobs methods
  def self.send_message_to_all_users(user, subject, body, locale)
     AdminMailer.send_message_to_all_users(user, subject, body, locale).deliver
  end

 def deliver
  sleep 15
 end

end

users的邮件列表超过20,000个电子邮件帐户。

我的问题是,通过大邮件列表发送简报是否正确,或者我可以更好地完成此任务。

谢谢!

3 个答案:

答案 0 :(得分:0)

查看resque_mailer和此question

答案 1 :(得分:0)

如果您被锁定使用delayed_job,请查看此railscast。该演员特别针对延迟邮寄。

答案 2 :(得分:0)

我认为你应该在这里查看find_in_batches方法:http://guides.rubyonrails.org/active_record_querying.html

在您的情况下,您可以先批量查找所有用户,然后从那里将每个批次分配给您的send_email_to_all_users方法调用(将每个批次替换为User.all。

或者,更好的是,您可以将整个简报流程移动到自己的类中并将其封装一点(因此,仍然从控制器调用该方法,但运行该类中的所有逻辑。)

无论如何,我认为find_in_batches是你需要的。