我正在为一个招聘委员会工作,需要根据每12小时内发布的工作向订阅者发送电子邮件通知。
send_post_email.html.erb(梅勒模板)
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<div>
<h3> Hi, new job just posted on FarFlungJobs.com! </h3>
</div>
<section>
<p>Fresh Job</p>
<hr>
<p>
<%= Job.select do |job| %>
<section class="container">
<div class="row jobs">
<div class="col-md-4" style="font-size: 20px;"><strong><%= job.company_name %></strong></div>
<div class="col-md-4" style="font-size: 20px;"><%= link_to(job.title, job) %></div>
<div class="col-md-4 text-right" style="font-size: 20px; float: left;"><%= job.created_at.strftime('%d %B %y') %></div>
</div>
<%= render 'shared/two_breaks'%>
</section>
<% end %>
</p>
<p>Thanks for subscribing to FarFlungJobs once again. <%= jobs_url %> </p>
</section>
</body>
</html>
job_notifier.rb
class JobNotifier < ApplicationMailer
def send_post_email(job)
@user = User.where(:email => true).all
emails = @user.collect(&:email).join("#{','}")
@jobs = job
@job = job
mail(:to => emails, :bcc => User.pluck(:email).uniq, :subject => 'New job posted on FarFlungJobs')
end
end
jobs_controller.rb
class JobsController < ApplicationController
def update
@job = Job.find(params[:id])
if !(@job.paid?)
@job.update_attributes(stripeEmail: params[:stripeEmail], payola_sale_guid: params[:payola_sale_guid])
if @job.paid?
JobNotifier.send_post_email(@job).deliver_now
end
@job.update(job_params) if params.has_key?(:job)
redirect_to preview_job_path(@job) #show_job_path
else
render :edit
end
end
end
job.rb(模型)
class Job < ActiveRecord::Base
def self.jobs_posted_12hrs_ago
where.not('stripeEmail' => nil).where.not('payola_sale_guid' => nil).where('created_at > ?', 18.hours.ago)
end
end
注意:这会发送电子邮件,但会在数据库中发送所有已发布的作业,这是我不想要的。
我想做的是将过去12小时内新发布的作业发送给电子邮件订阅者。
答案 0 :(得分:2)
在我看来,你应该有一个工作(ActiveJob)使用你在“工作”模型中定义的范围,并将其设置为每天重复,你必须使用像sidekiq或任何其他,信息的作业服务器here
这份工作应该是这样的。
class NewJobsMailer < ApplicationJob
queue_as :default
def perform(*guests)
jobs = Job.jobs_posted_12hrs_ago
jobs.each do
JobNotifier.send_post_email(@job).deliver_now
end
end
end
它不完美,但我希望你能用它作为指导。