所以我一直在建立一个网站,我现在实施了“高级”会员资格,每年一次用条纹自动重新发布新闻。在我的数据库中,我将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
谢谢大家:)
答案 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
答案 1 :(得分:0)
您可以通过将代码安排在将来运行,或者作为cronjob或其他机制来实现。
然而,更好的解决方案可能根本没有布尔列。鉴于expires
是一个日期列(会议将其称为expires_at
以使其清晰),您可以从表中删除business
列并添加
def business
expires > Time.now
end
代替您的模型,它会告诉您个人用户是否已过期。
同样,范围如
scope :active, -> { where("expires > ?", Time.now) }
您是否允许查询数据库中未过期的用户。
如果你想在到期时做一些额外的工作(例如发送电子邮件通知),那么这将不起作用,但如果你只需要更新布尔值,那么这完全避开了调度问题。