我想每天早上将新清单的摘要发送给我们的用户。用Ruby On Rails 4,ActiveRecord(使用SendGrid)和延迟作业来做到这一点的最佳方法是什么?
我目前正在这样做:
在控制器中:
def yesterday_listings_for_users
yesterday_listings = Listings.where('status = "0" AND (DATE(created_at) = ?)', Date.today - 1)
if yesterday_listings.count > 0
NotificationMailer.delay.yesterday_listings_for_users_notification
end
render :nothing => true
end
然后在邮件中:
def yesterday_listings_for_users_notification
@listings = Listing.where('status = "0" AND (DATE(created_at) = ?)', Date.today-1)
mail(to: '[email protected]', subject: "Latest Listings", from: '[email protected]')
end
使用CRON作业后,每天早上都会通过我的电子邮件地址向我发送报告。我的数据库中有数百名用户,我也想向他们发送此电子邮件。
怎么做?我想知道这样的事情:
def yesterday_listings_for_users_notification
@listings = Listing.where('status = "0" AND (DATE(created_at) = ?)', Date.today-1)
Users.all.each do |user|
mail(to: user.email, subject: "Latest Listings", from: '[email protected]')
end
end
但是,是否建议(或适当地)遍历数据库中的数百条记录并以延迟的邮件程序方法发送数百封电子邮件?
有更好的方法吗?
先感谢您!
我通常更喜欢与Sidekiq
一起使用,Sidetiq
但是如果您想使用,delayed_job
我建议您使用whenever
gem来简化操作。
每当有Ruby gem时,它都会为编写和部署cron作业提供清晰的语法。
gem 'whenever'
到您的gemfilewheneverize .
将生成文件的命令config/schedule.rb
在您config/schedule.rb
执行以下操作。
every 1.day, :at => '11:30 am' do
runner "User.delay.send_daily_newsletter"
end
在您user.rb
定义方法send_daily_newsletter
并使用find_each
而不是all.each
(批处理)
def self.send_daily_newsletter
listings = Listing.where('status = "0" AND (DATE(created_at) = ?)', Date.today - 1).select(:title).to_json
User.select(:id, :email).find_each do |u|
NotificationMailer.delay.send_daily_newsletter(u.email, listings)
end
end
在你的notification_mailer.rb
定义send_daily_newletter
def send_daily_newsletter(user_email, listings)
@listings = listings
mail(to: user_email, subject: "Latest Listings", from: '[email protected]')
end
这样,您将有一个延迟的工作来获得所有用户并使用单独的工作人员发送每封电子邮件,这是完成此任务的最佳方法。
注意:不要忘记更改排名的方法,从您的视图,例如,
listing.title
到listing[:title]
因为我们传递的清单作为json
。如果您不想
json
每次都将它们传递给每个延迟的任务,只需将列表缓存在其中,Rails.cache
并在完成发送后将其清除。
编辑:
如果您由于在delayed_job
gem中遇到问题而要使用缓存方法,请send_daily_newsletter
在邮件程序中编辑该方法。(这就是为什么我会选择基于redisSidekiq
而不是基于mysql的原因delayed_job
。
def send_daily_newsletter(user_email)
@listings = Rails.cache.fetch('today_listings') { Listing.where('status = "0" AND (DATE(created_at) = ?)', Date.today - 1) }
mail(to: user_email, subject: "Latest Listings", from: '[email protected]')
end
在你的 user.rb
def self.send_daily_newsletter
User.select(:id, :email).find_each do |u|
NotificationMailer.delay.send_daily_newsletter(u.email)
end
Rails.cache.clear('today_listings')
end
祝你好运。我已经做这些电子邮件新闻通讯已有一段时间了,他们真的很痛苦:D
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句