0

我有两个模型,用户和图像。

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

现在,如果您看到上面的代码,我将覆盖模型中的销毁调用。不是当用户删除他的帐户时,我想触发依赖 => 销毁回调,以便我触发 Image 的销毁。

PS:我不想使用 act_as_paranoid 或其他一些插件。我需要触发dependent=> destroy 因为我有一个非常复杂的映射,例如:

用户 has_many 图像、has_many 评论、has_many likes、has_many 活动以及更多 9 种类型的映射以及深度映射等。

4

2 回答 2

1

你只需要模拟依赖破坏。

在你的destroy方法中调用你的Image的所有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

这是一个非常hack-ish 的实现,但它确实有效。如果您按照帖子中的描述添加 Comment 模型,您只需将 has_many 语句添加到 User 并在 Comment 模型中包含 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 回答