如何在rails中自动从数据库中删除记录

时间:2013-06-12 05:38:42

标签: ruby-on-rails database

我有一个称为产品的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

4 个答案:

答案 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

选项2 - sidekickSidetiq宝石

# 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

从命令行运行该命令