如何通过Action Mailer每天发送独特的消息

时间:2014-11-20 13:02:25

标签: ruby-on-rails ruby ruby-on-rails-4 actionmailer

所以我有一份时事通讯,但是我无法想出跟踪已发送的报价的方法。我想跟踪发送的报价以避免发送重复项。

应用程序非常简单,有一个属于类别模型的引用模型,以及属于类别模型的订阅者模型。类别has_many订阅者和引号。

以下代码将第一个Quote发送给其订阅者。当然,您必须维护一个表或字段,以便跟踪之前发送给订户的报价,以便您始终可以设置每天发送新报价。

Category.all.each do |category|
   category.subscribers.each do |subscriber|
      SubscriptionMailer.sendmyemail(subscriber.email, category, category.quotes.first.body, category.subscribers).deliver          
   end
end

这可以进一步更新为:

Category.all.each do |category|
   category.subscribers.each do |subscriber|
      SubscriptionMailer.sendmyemail(subscriber.email, category, subscriber.choose_quote(category), category.subscribers).deliver          
   end
end    

在我的subscriber.rb模型中,我准备好了这个方法,但不确定用什么代码来填充它以实现我想要的。如何每天向订阅者发送一个独特的报价,而不是过去发送的内容的重复?或者甚至更简单的方法是随机化订单,这可能吗?

def choose_quote(cat)
  # send quote which is unique 
  # Meaning which was not sent 
end

1 个答案:

答案 0 :(得分:7)

  • 您正在向订阅者发送报价
  • 您需要跟踪已向您的用户发送的报价。

我建议为您提到的特定问题提供可能的解决方案设计。

rails generate model quote_history subscriber:references quote:references # assumed there
#is a model subscriber and quote

所以现在subscriber_quote_history也属于订阅者和引用。

class QuoteHistory < ActiveRecord::Base
  belongs_to :subscriber
  belongs_to :quote
  validates :quote_id, :uniqueness => {scope: :subscriber_id}
end

所以订阅者,引用都应该有很多引用它们已被发送。

class Subscriber < ActiveRecord::Base
   has_many :quote_histories
   .....
end

class Quote < ActiveRecord::Base
   has_many :quote_histories
   scope :uniq_quote_for, Proc.new {|subscriber_id| includes(:quote_histories).where.not(quote_history: {subscriber_id: subscriber_id})}
   .....
end

现在我建议你用你想要的方法写一些条件:

class Subscriber < ActiveRecord::Base
 def choose_quote(cat)
   quote = cat.quotes.uniq_quote_for(self.id).order("RANDOM()").first #Add a new history after that for that. here you will decide your own business logic.
   return quote if self.quote_histories.create(qoute_id: quote.id)
   return nil
 end
end

在邮件程序中执行类似的操作:

Category.all.each do |category|
   category.subscribers.each do |subscriber|
      quote = subscriber.choose_quote(category)
      if quote  # if quote found then send email
       SubscriptionMailer.sendmyemail(subscriber.email, category, quote, category.subscribers).deliver    
      else
        next # if no quote found then go to next loop.
      end      
   end
end  

我相信这有助于您设计解决方案。请注意,我在这里写了一切来自可视化和我自己的逻辑。请跳过一些不需要的传统错误或任何内容我的目的是向您展示解决问题的方法。

感谢。