2012-04-05 36 views
0

我有两个模型,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 

现在,如果你看到上面的代码,我重写模型中的销毁呼叫。不是当用户删除他的帐户时,我想触发依赖=>销毁回调,以便我触发摧毁图像。

PS:我不想使用act_as_paranoid或其他插件。我需要触发依赖=>破坏,因为我有一个非常深的复杂的映射是这样的:

用户的has_many图像, 的has_many评论, 的has_many喜欢, 的has_many活动 和一些9种类型的映射,并再次深马平等等。

回答

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实现,但它的工作原理。如果您在帖子中添加了评论模型,则只需将has_many语句添加到用户,并在评论模型中包含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 
1

你只需要模拟相关的破坏。

在你摧毁方法调用的所有销毁方法图像的

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 
相关问题