2011-07-11 25 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に変更するだけです。元に戻すには、元に戻してください。 – coreyward

+0

よかった。私はレコードにアクセスするたびにこのフラグをチェックしなければならないと思いますか?非アクティブなレコードを自動的に除外する方法はありますか? – providence

+0

@providenceあなたのモデルで 'default_scope'(http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-default_scope)を使用して、非アクティブなレコードを除外することができます。ありがとう、 –

答えて

1

これを行うより安定した方法は、データベースに「アクティブ」ブール値フラグをデフォルトでtrueにすることです。レコードを削除するときは、フラグをfalseに変更するだけです。元に戻すには、元に戻してください。

# 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が含まれているので、データベースにこの情報が簡単にアクセスできるようにすることは賢明です。

関連する問題