我有一个称为产品的rails表设置并且它一切运行良好,让我们假设我想在创建后3周自动删除记录如何进行代码
我的产品数据库如下
class Products < ActiveRecord::Migration
def change
create_table :products do |t|
t.text :description
t.string :price
t.string :name
t.string :contact
t.attachment :photo
t.string :slug
t.integer :user_id
t.timestamps
end
add_index :products, :user_id
end
end
答案 0 :(得分:4)
如何处理此任务有不同的方法。检查以下2个选项。
选项1 - whenever gem
您可以使用每30天运行一次的任务来设置任务。
1-生成如下任务:
rails g task posts delete_30_days_old
2-在您的应用程序中创建ruby文件
# lib/tasks/delete_old_records.rb
namespace :posts do
desc "Delete records older than 30 days"
task delete_30_days_old: :environment do
Post.where(['created_at < ?', 30.days.ago]).destroy_all
end
end
# in app/workers/clean_posts.rb
class CleanPosts
include Sidekiq::Worker
include Sidetiq::Schedulable
recurrence { monthly }
def perform
Post.recent.destroy_all
end
end
和
# /models/post.rb
class Post < ApplicationRecord
scope :recent, -> { where('created_at >= :thirty_days_ago', thiryty_days_ago: Time.now - 30.days) }
end
由于Ruby是关于美的,所以将where子句移动到你的模型,在那里可以重用它。
这些选项会从您的数据库中删除旧帖子,您的应用程序将无法再访问它们。
答案 1 :(得分:3)
如果您想自动执行某项操作,则应在应用中使用cron作业。我有一个使用clockwork gem的应用程序,用于在后台安排一些过程。
将它放在你的Gemfile
上gem 'clockwork'
gem 'foreman'
在文件夹clock.rb
app
require './config/boot'
require './config/environment'
require 'clockwork'
module Clockwork
every(1.day, 'delete.product', :at => '00:00') {
Product.where("created_at >= ?", 3.week.ago.utc).destroy_all
}
end
运行测试发条
clockwork app/clock.rb
例如,这是我的应用程序使用发条自动删除用户每隔30.seconds:
C:\Sites\multiple>clockwork app/clock.rb
I, [2013-06-12T13:36:14.380239 #2356] INFO -- : Starting clock for 1 events: [
delete.user ]
I, [2013-06-12T13:36:14.380239 #2356] INFO -- : Triggering 'delete.user'
I, [2013-06-12T13:36:44.784978 #2356] INFO -- : Triggering 'delete.user'
或者如果您想在应用程序中运行发条,那么使用工头冷却就像:
foreman start
注意:正在运行的工头你应该在你的机器上安装工头
答案 2 :(得分:2)
您需要创建一个cron作业,该作业必须在特定时间每天运行。要设置Cron作业,您可以使用Gem WHENEVER
查询应该像
Product.where("created_at <= ?", Time.now - 3.weeks).destroy_all
答案 3 :(得分:1)
创建rake任务并定期运行该rake任务。类似的东西:
delete_old_products.rake:
task delete_old_products: :environment do
Product.where("created_at <= ?", Time.now - 3.weeks).each do |product|
product.destroy
end
end
您可以使用rake delete_old_products