2011-07-11 84 views
0

我試圖在記錄被刪除後提供撤消功能。要做到這一點,我刪除之前,我克隆它的記錄,並把它放在會話像這樣:無法保存克隆記錄

session[:undo] ||= [] 
session[:undo] << record.clone 

然而,當我後來做

rec = session[:undo][-1] 
rec.save! 

記錄不會被保存。服務器控制檯輸出說

(0.2ms) BEGIN 
[paperclip] Saving attachments. 
(0.2ms) COMMIT 

這讓我覺得它被保存,但它不在數據庫。我很困擾。有任何想法嗎?

+3

這樣做的更穩定的方法是在數據庫中有一個「有效」布爾標誌,默認爲true。刪除記錄時,只需將該標誌更改爲false即可。要撤消您只需將其更改爲true即可。 – coreyward

+0

哦,不錯。我想我每次訪問記錄時都必須檢查這個標誌嗎?有沒有辦法自動排除不活動的記錄? – providence

+0

@providence,您可以在模型中使用'default_scope'(http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c- default_scope)來排除不活動的記錄。 –

回答

1

這樣做的更穩定的方法是在數據庫中有一個「有效」布爾標誌,默認爲true。刪除記錄時,只需將該標誌更改爲false即可。要撤消您只需將其更改爲true即可。

# models/attachment.rb 
class Attachment < ActiveRecord::Base 
    default_scope where(:active => true) 

    def self.include_inactive 
    unscoped 
    end 
end 

# in your migration 
def self.up 
    change_table :attachments do |t| 
    t.boolean :active, :default => true, :null => false 
    end 

    add_index :attachments, :active 
end 

self.include_inactive方法其實只是爲了清楚。它實際上只是unscoped的別名,它將重置忽略已刪除記錄的default_scope。例如,如果您想要顯示管理員儀表板中的所有記錄,則可以致電Attachment.include_inactive

另請注意active列中的索引。由於大多數查詢將包含where 'active' = 1,因此確保您的數據庫具有易於訪問的信息是很明智的。