如何在一定时间后自动更新数据库中的布尔值?

时间:2016-03-12 05:18:22

标签: ruby-on-rails postgresql

所以我一直在建立一个网站,我现在实施了“高级”会员资格,每年一次用条纹自动重新发布新闻。在我的数据库中,我将business作为布尔值,expires作为字符串。

这是我的SubscriptionsController的代码:

class SubscriptionsController < ApplicationController

before_action :logged_in_user, only: [:new, :create]

def new
end

def create
    token = params[:stripeToken]
    customer = Stripe::Customer.create(
        card: token,
        plan: 1,
        email: current_user.email,
        )

    current_user.business = true
    current_user.stripeid = customer.id
    current_user.expires  = 1.year.from_now
    current_user.save       #Create a one year from now expiry, when date == expires current_user.business = false

    flash[:success] = "You've successfully subscribed, you have been charged $159."
    redirect_to current_user #Add redirect to dashboard once implemented
end

def update
    @user = User.find_by(:id)
    if Time.now >= @user.expires
        @user.business = false
    end
end

def logged_in_user
  unless logged_in?
      store_location
      flash[:danger] = "Please log in to view this page."
      redirect_to login_url
  end
end 
end

基本上,我想做的就是我在def update中所做的,但我知道这是行不通的。但也许有一种方法可以在我的数据库中进行这样的论证?

我正在使用的数据库是postgresql
付款处理方为stripe
用户模型/身份验证系统为custom而非devise

谢谢大家:)

2 个答案:

答案 0 :(得分:3)

有一个名为whenever的宝石符合您的要求。

当您安排时,这将运行cron-job(a task)

<强>步骤:

$ gem install whenever
Or with Bundler in your Gemfile.

gem 'whenever', :require => false
Getting started

$ cd /apps/my-great-project
$ wheneverize .
This will create an initial config/schedule.rb file for you.

<强>示例:

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end

This link gives you complete detail

答案 1 :(得分:0)

您可以通过将代码安排在将来运行,或者作为cronjob或其他机制来实现。

然而,更好的解决方案可能根本没有布尔列。鉴于expires是一个日期列(会议将其称为expires_at以使其清晰),您可以从表中删除business列并添加

def business 
  expires > Time.now
end

代替您的模型,它会告诉您个人用户是否已过期。

同样,范围如

scope :active, -> { where("expires > ?", Time.now) }

您是否允许查询数据库中未过期的用户。

如果你想在到期时做一些额外的工作(例如发送电子邮件通知),那么这将不起作用,但如果你只需要更新布尔值,那么这完全避开了调度问题。