Rails定位所有过期试用的用户

时间:2014-05-31 05:15:24

标签: ruby-on-rails ruby-on-rails-3

我试图找到一种简单的方法让我的任务rake在数据库中找到距离created_at还有0天的用户。到目前为止,我一直在玩这个,对单个用户很有用,但我想要检查每个用户,如果发现一个或多个用户还剩0天......做点什么。这是我到目前为止所做的事情。

task :check_trial => :environment do
   def remaining_days
       users = User.all
       users.each do |user|
           ((user.created_at + 30.days).to_date - Date.today).round
       end
   end
   if remaining_days <= 0
      redirect_to http://www.google.com
   end
end

不是最干净的,但上述任何一种方式都不适合我。我没有得到关于User.all的一些信息。任何人,请提前协助并表示感谢

3 个答案:

答案 0 :(得分:3)

更好的方法是仅从DB中获取过期的用户。在用户模型中写下以下方法

def self.expired_users
  where("created_at < ?", (DateTime.now - 30.days).beginning_of_day)
end

在你的佣金任务中:

User.expired_users.each do |user|
 # do_something
end

希望这有助于:)

答案 1 :(得分:1)

我会做这样的事情:

#user.rb

class User
  scope :expired, -> { where("created_at < ?", Datetime.now - 30.days) }

#rake task

task :check_trial => :environment do
  User.expired.each do |user|
    #something
  end
end

我不完全确定你想用rake任务做什么。重定向很奇怪,因为您不在浏览器中。如果你能解释一下你拥有所有过期用户后你想要实现的目标,我可以帮助你解决这个问题。

答案 2 :(得分:0)

  1. 您需要一个方法/查询来提取30天前创建的试用版的所有用户的集合
  2. 你的任务应该采取这些数据,循环通过&amp;在个人记录上执行您的活动
  3. -

    Scope

    您最好使用User模型的范围(已在答案中提供):

    #app/models/user.rb
    Class User < ActiveRecord::Base
       scope :expired, -> { where("created_at > ? ", 30.days_ago) }
    end
    

    这样您就可以选择users,其条件是在30天前创建 的试用版 - 因此:@users = User.expired

    -

    <强>任务

    这将允许您按如下方式循环过期试验:

    task :check_trial => :environment do
       def remaining_days
           for user in User.expired do
               ....
           end
       end
    end