0

ユーザーとイメージの2つのモデルがあります。

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やその他のプラグインは使いたくありません。次のような非常に複雑なマッピングがあるため、dependent=>destroyをトリガーする必要があります。

ユーザーhas_many画像、has_manyコメント、has_manyいいね、has_manyアクティビティ、さらに9種類のマッピング、さらにディープマッピングなど。

4

2 に答える 2

1

依存する破棄をエミュレートする必要があります。

destroyメソッドで、画像のすべての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 
于 2012-04-05T07:53:50.870 に答える
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ステートメントをUserに追加し、Archivableをコメントモデルに含めるだけです。

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
于 2012-04-05T09:29:18.433 に答える