2012-04-05 13 views
0

私は2つのモデルUserとImageを持っています。どのようにトリガーできますか:dependent => destroy

class User < ActiveRecord::Base 
    has_many :images,:order => "created_at DESC", :dependent => :destroy, :conditions => "archive = 0" 

    def destroy 
    self.archive = 1 
    self.deleted_at = Time.now 
    self.save 
    end 
end 


class Image < ActiveRecord::Base 
belongs_to :user , :counter_cache => true 

def destroy 
    self.archive = 1 
    self.deleted_at = Time.now 
    self.save 
end 
end 

上記のコードが表示されたら、モデルのdestroy呼び出しをオーバーライドしています。ユーザーが自分のアカウントを削除していないときに、私は依存関係をトリガーしたいと思います。>コールバックを破棄して、イメージを破棄します。

PS:act_as_paranoidや他のプラグインを使用したくありません。

ユーザーhas_manyの画像、 has_manyのコメント、 has_manyのが好き、 has_manyの活動 といくつかのマッピングより9種類と、再び深いmaping:私は、私のような非常に深い複雑なマッピングの何かを持っているとして=>破棄依存トリガする必要があります

答えて

0

おそらく、物事を少し簡単にするために、あなたはアーカイブのモデルとモジュール内のアーカイブモデルの両方の振る舞いをカプセル化する可​​能性が破壊:

module Archivable 
    def archive! 
    self.archive = 1 
    self.deleted_at = Time.now 
    self.save 
    end 
end 

module Archiver 
    def destroy 
    self.archive = 1 
    self.deleted_at = Time.now 
    archive_models! 
    self.save 
    freeze 
    end 

    def archive_models! 
    archivable_models.each do |model| 
     model_name = model.name.pluralize.downcase.to_s 
     self.send(model_name).each { |m| m.archive! } 
    end 
    end 

    def archivable_models 
    ActiveRecord::Base.send(:subclasses).select { |m| m.method_defined?(:archive!) } 
    end 
end 

class Image < ActiveRecord::Base 
    include Archivable 
    belongs_to :user, :counter_cache => true 
end 

class User < ActiveRecord::Base 
    include Archiver 
    has_many :images,:order => "created_at DESC", :conditions => "archive = 0", :dependent => :destroy 
    attr_accessible :name 
end 

これはかなりハックアイ実装ですが、動作します。投稿に記載されているようにコメントモデルを追加すると、コメントモデルにhas_manyステートメントを追加し、アーカイブモデルをコメントモデルに追加するだけです。

class User < ActiveRecord::Base 
    include Archiver 
    has_many :images,:order => "created_at DESC", :conditions => "archive = 0", :dependent => :destroy 
    has_many :comments,:order => "created_at DESC", :conditions => "archive = 0", :dependent => :destroy 
    attr_accessible :name 
end 


class Comment < ActiveRecord::Base 
    include Archivable 
    belongs_to :user, :counter_cache => true 
end 
1

依存破壊をエミュレートするだけで済みます。あなたのdestroyメソッドの呼び出しで

すべてはあなたのイメージの方法

class User < ActiveRecord::Base 
    has_many :images,:order => "created_at DESC", :dependent => :destroy, :conditions => "archive = 0" 

    def destroy 
    self.archive = 1 
    self.deleted_at = Time.now 
    self.save 
    self.images.each(&:destroy) 
    end 
end 
関連する問題