2

我有一个名为 products 的 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

4 回答 4

7

如何处理此任务有不同的方法。检查以下 2 个选项。

选项 1 -每当宝石

您将设置一个任务,例如每 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 子句移到您的模型中,在哪里可以重用它。

这些选项将从您的数据库中删除旧帖子,并且您的应用程序将无法再访问它们。

于 2016-12-20T04:18:17.433 回答
3

如果您想自动执行操作,则应在您的应用程序中使用 cron 作业。我有一个使用发条宝石的应用程序在后台安排一些进程。

一步步 :

把它放在你的 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

注意:运行工头你应该在你的机器上安装工头

于 2013-06-12T06:42:31.150 回答
3

您需要创建一个 cron 作业,它必须在每天的特定时间运行。要设置 Cron 作业,您可以使用 Gem WHENEVER

查询应该像

Product.where("created_at <= ?", Time.now - 3.weeks).destroy_all
于 2013-06-12T06:14:18.927 回答
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

于 2013-06-12T05:58:22.360 回答