2012-02-17 20 views
6

私は:destroyメソッドの動作を上書きするために多くのことを試みましたが、何も動作しません。私はまずacts_as_paranoiaプラグインを使用しましたが、has_many:throughアソシエーションのモデルでは動作しません。Rails:上書きする方法:破壊方法?

私は上書きしたい:私はだけではなく、レコード自体を破壊する別のフィールド(0にステータス)を更新したい、ある

def destroy 
    _run_destroy_callbacks { delete } 
    end 

    def delete  
    self.update_attribute(:status => 0) 
    freeze 
    end 

:ちょうどこのような何かをする方法を破壊します。

答えて

5

あなたは?:

class MyClass < ActiveRecord::Base 
    def destroy 
    update_attribute(:status, 0) 
    end 
end 

EDITみました:コメントに基づいは、そこに仕事で何か他のものかもしれないし、それだけかもしれません(:依存=>「」)関連の定義に指定 - またはHABTMの場合は、まったく機能しない可能性があります。たぶんthis info on delete and destroy through associationsがお手伝いしますか?以下の貼り付け関連セクション:

削除または破棄しますか?

has_manyとhas_and_belongs_to_manyの関連付けには、 のdestroy、delete、destroy_all、およびdelete_allの各メソッドがあります。

has_and_belongs_to_manyの場合、削除と破棄は同じです。つまり、 は、結合テーブルのレコードを削除します。

has_manyの場合、destroyは常に、コールバックが実行されるように削除されるレコードのdestroyメソッドを呼び出します。ただし、 は、 :依存オプションで指定された戦略に従って削除を行います。または、依存オプションが指定されていない場合は、 デフォルト戦略に従います。既定の戦略は、デフォルトの 戦略がdelete_all(参加レコードを削除し、 コールバックを実行せず)の場合、has_many:throughを除いてnullify( 外部キーをnilに設定する)です。

+0

はい、私が試した最初のことでした。これは何もしません。私はログからDELETE FROMリクエストを見ることができます。カスタム破壊メソッドは呼び出されないようです。 –

+0

Hrm、私は実際にいくつかのアプリでいくつかのモデルでこれを使用し、それは間違いなく動作します。この特定のモデルには特別なものはありますか?あなたは削除または破壊を呼びますか?あなたは後者が必要です。 – miked

+0

AREL(ActiveRecord関係)でそのレコードが親から破棄されました。おそらく問題でしょうか?実際、ワインのモデルと記録(メインフォーム、コントローラーの更新メソッド)を更新し、子供を削除することを選択した場合(カスタム破壊を含む品種モデル)、それは明らかに呼び出されません。たぶん、レールメカニズムは、子を破壊する親(子モデルで破壊を呼び出さないでください)を破棄するのとは異なります。 –

0

Mikedは、私たちが「手動」品種を破壊する場合は、このコードはよかった、言ったように:

@varietal = Varietal.find('1')  
@varietal.destroy 

def destroy 
    update_attribute(:status, 0) 
end 

これは完璧に動作します。しかし、私が言ったように、親レコードを更新すると、子に呼び出されたdestroy/delete/deleteメソッドが見つかりませんでした。だから誰かがアイディアを持っていれば...

2

私は最高だと思います

def Model 
    before_destroy: mark_as_deleted 

    def mark_as_deleted 
     self.update_attribute(:status => 0) 
    end 
end 

これはしかしdestroyをキャンセルしません。これを行う方法は、扶養家族を操作するためbefore_destroy:フィルタを上書きすることです。

The full callback documentation is here

+0

これはまだコントローラ内でdestroy()を呼び出しています。偽を返すことは、少なくとも私が言うことができない限り、機能しません。 –

関連する問題