как автоматически удалить запись из базы в рельсах

У меня есть настройка таблицы рельсов, называемая products, и все работает хорошо. Допустим, я хочу автоматически удалить запись через 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
 Jyothu12 июн. 2013 г., 08:17
Смотри мой ответ, я тоже столкнулся с такой же ситуацией. И я сделал то, что объяснил в своем ответе. Это может помочь вам.

Ответы на вопрос(4)

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

который должен запускаться каждый день в определенное время. Для настройки задания Cron вы можете использовать GemВСЯКИЙ РАЗ, КОГДА

И запрос должен быть как

Product.where("created_at <= ?", Time.now - 3.weeks).destroy_all
Решение Вопроса

же.

Опция 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 -кореш а такжеSidetiq драгоценные камни

# 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 в свою модель, где можно использовать его повторно.

Эти параметры будут удалять старые сообщения из вашей БД, и они больше не будут доступны вашему приложению.

вы должны использовать cron job в своем приложении. У меня есть приложение, использующеезаводной драгоценный камень для графика некоторых процессов на заднем плане.

Шаг за шагом :

Поместите это в свой 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 секунд:

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

Заметка : Бегущий бригадир, вы должны установить бригадир на свою машину

 rails_id26 сент. 2016 г., 03:06
@KaMok спасибо за исправление.
 Ka Mok25 сент. 2016 г., 07:42
Я думаюproduct.each do должно быть@products.each do нет?

Ваш ответ на вопрос