2012-02-17 4 views
2

has_many:throughモデルは完全に動作します。Rails:dependent =>破壊する、破棄するのではなく別のアクションを呼び出す

has_many :varietals 
    has_many :grapes, :through => :varietals, :dependent => :destroy 

以下の代わりに、別のアクションを呼び出したいと思います。実際には、アイテムを無効にしたり破壊したりしたくないので、レコードを破棄するのではなく、レコードのステータスフィールドを1から0に更新します。

破壊する代わりにカスタムメソッドを呼び出す方法はありますか?私はモデル自体でそれを行うことができると思います...ありがとう。

ここにこのメソッドを挿入しますか?レコードが破壊されるマスターモデルまたはモデルでは?

EDIT

すみませんが、私は十分に私の問題を説明していなかったと思います。マスターモデルが破壊された後、私の問題は何かにだけではありません。マスターレコードが破棄されていない場合でも、バリエールモデル自体の破棄アクションをカスタム化する必要があります。以下のような

何か:実はこのアクションが呼び出されない

class Varietal < ActiveRecord::Base 

    private 
     def destroy 
     self.update_attributes(:status => 0) 
     end 
end 

...

答えて

1

にhas_many:依存は、唯一のいくつかのオプションに制限されています。 documentationによると:

:依存に設定するとする:すべての関連オブジェクトは、そのdestroyメソッドを呼び出すことで、このオブジェクトと一緒に を破壊され破壊します。 :delete_allに設定されている場合、関連するすべてのオブジェクトは、そのメソッドを呼び出すことなく削除されます。 nullに設定すると、関連付けられたすべてのオブジェクトの外部 キーは、セーブコールバックを呼び出さずにNULLに設定されます。 に設定されている場合:このオブジェクトはActiveRecord :: DeleteRestrictionError 例外を発生させ、関連付けられたオブジェクトがある場合は削除できません。

:throughオプションを使用する場合、結合モデル の関連付けはbelongs_toでなければならず、削除されるレコードは関連するレコードではなく結合 レコードです。

ステータスフィールドを更新するためにdestroyメソッドを変更する必要があるようです。

+0

などを説明します。

def destroy self.update deleted_at: Time.now run_callbacks :destroy end 

あなたも、この記事を読むことができますか? –

+0

私の以前のコメント(削除されたもの)を見ても大丈夫です...フィヨンとシンガラには正しいテイクがあります。 – ScottJShea

+0

申し訳ありませんが、問題は私のモデルの関連付けではありません。モデルが1つだけの場合、destroyメソッドを上書きしてその動作を変更することはできません。これは何もしません。前または後のコールバックを追加しても破棄は変更されません。アイテムは破棄されます。 –

2

before_destroyまたはafter_destroyにコールバックを追加して、関連付けを操作するだけで済みます。例:

after_destroy :do_on_grapes 

def do_on_grapes 
    grapes.map(&:to_do) 
end 
7

ここでは、カスタムロジックを配置するためにbefore_destroyを使用できます。例:

before_destroy :reset_status 

def reset_status 
    ... 
end 

詳細については、hereを参照してください。

0

あなたの問題を解決するには、カスタムの破壊方法を提供することをお勧めします。そここれらのような質問には、いくつかの回答がありますが、あなたはActiveRecordのと関係が好きなことを心に留めておく必要があります:あまりにも、あなたの関係にチェーンを破壊する引き金

class Image < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 

使用コールバックメカニズムが。通常、このメカニズムを保持してカスタム実装に追加する必要があります。例えば。破壊する方法を変更する方法...私は私の最初のメッセージを更新し Triggering dependent: :destroy with overridden destroy-method

関連する問題