我试图在删除记录后提供撤消功能。为此,在删除记录之前,我将其克隆并将其放入会话中,如下所示:
session[:undo] ||= []
session[:undo] << record.clone
然而,当我后来做
时rec = session[:undo][-1]
rec.save!
记录未保存。服务器控制台输出显示
(0.2ms) BEGIN
[paperclip] Saving attachments.
(0.2ms) COMMIT
这让我觉得它已保存,但它不在数据库中。我很迷茫。有什么想法吗?
答案 0 :(得分:1)
更稳定的方法是在数据库中使用“active”布尔标志,默认为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
,因此确保您的数据库可以轻松访问此信息非常明智。