2014-02-18 81 views
1

爲了學習目的,我創建了一個博客,現在我想在創建後的30天后自動銷燬帖子。我該怎麼做?創建30天后銷燬帖子

這是我的帖子控制器

def index 
    @posts = Post.all 
    end 
    def create 
    @post = current_user.posts.new(post_params) 
    @post.save 
    redirect_to posts_path 
    end 
    def destroy 
    @post.destroy 
    redirect_to posts_path 
    end 
+1

你在這裏有很好的和有益的答案。我認爲作者應該得到一個投票,並且✅接受他/她,因爲它解決了您的問題,或者在尋找解決方案時最有幫助。 – egyamado

回答

2

帖子將被存儲在數據庫中。該模型是與您的數據庫進行交互的。你的控制器永遠不會看到數據庫,它只能看到模型顯示的內容。如果你想在控制器內使用你的模型從數據庫中提取數據,你可以用這個代碼來完成。

@posts = Post.where('created_at >= :thirty_days_ago', thiryty_days_ago: Time.now - 30.days)

Post在這個代碼調用您的應用程序/模型/ Post.rb其繼承的活動記錄。 .where是基於您定義的內容查看數據庫的活動記錄方法。在這裏,我們定義了僅拉動created_at列在30天前有時間的行。

如果你看看你的數據庫裏面,你會注意到created_at列被自動地放在那裏。

+0

我也在考慮這個解決方案,並去看看是否有其他人提供它。我會採取這種方法有類似的要求 –

+0

但是,如果這種方法,我仍然可以通過他們的URL – userails

+0

@ user3304070訪問帖子 - 如果你刪除帖子,他們不能再通過他們的URL訪問,因爲他們已經從數據庫。 –

1

爲了達到期望的結果,你需要改變你的index操作是這樣的:

def index 
    @posts = Post.where(created_at: 30.days.ago..Time.now) 
end 

在這種方式,你不會需要銷燬的帖子,你會得到期望的結果。

如果需要限制訪問的舊帖子,那麼你可以使用:

def show 
    @post = Post.where(created_at: 30.days.ago..Time.now).find(params[:id]) 
end 

而且,如果我們正在談論的代碼之美,那麼你應該在你的模式轉變where(created_at: 30.days.ago..Time.now)部分的範圍,像這樣:

class Post 
    ... 

    scope :recent, -> { where(created_at: 30.days.ago..Time.now) } 
end 

而且使用這樣的:

Post.recent #=> to get list of recent posts 
Post.recent.find(params[:id]) #=> to get recent post with specified id 
+0

此解決方案的工作,但我仍然可以通過網址 – userails

+0

@userails訪問的帖子我認爲show方法負責隱藏記錄。我測試了一個記錄超過30天,我得到了無法找到記錄錯誤'無法找到與'id'= 20 [郵政(「職位」,「created_at」之間$ 1和$ 2)]後]是由show方法引起的。這仍然不刪除或銷燬任何recored。 – egyamado

0

你不能這樣做從你的控制器,你需要添加一些功能到你的應用程序。

您將需要每天運行的cron作業,查找超過30天的帖子並銷燬它們。

Post.where('created_at < ?', 30.days.ago)

爲了處理cron作業更好的你可以考慮使用whenever gem是有很大幫助,並保持的cron設置在您的應用程序。

4

我會設置一個每天運行一次的任務whenever

要生成一個任務:

rails g task posts delete_30_days_old 

然後在創建的文件(LIB /任務/職位。RB),添加以下代碼:

namespace :posts do 
    desc "TODO" 
    task delete_30_days_old: :environment do 
    Post.where(['created_at < ?', 30.days.ago]).destroy_all 
    end 
end 

,如果你想刪除已超過30天的帖子這是當然的,其他的答案還不如工作,但我寧願讓我的乾淨的數據的數據庫,我將用於我的應用程序。

2

除了前面提到的whenever寶石外,您還可以使用稱爲SidekiqSidetiq的兩個寶石來安排任務/工作人員。

我一直在工作中使用這些大型應用程序,我很滿意它。它很快(使用Redis,添加了一個簡單的寶石,可靠,易於使用)。

# in app/workers/clean_posts.rb 
class CleanPosts 
    include Sidekiq::Worker 
    include Sidetiq::Schedulable 

    recurrence { monthly } 

    def perform 
    # stealing from toolz 
    Post.where('created_at >= :thirty_days_ago', thiryty_days_ago: Time.now - 30.days).destroy_all 
    end 
end 

但是,這將從您的數據庫中刪除帖子,並且它們將不再由您的應用程序訪問。