2012-04-05 38 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 
相關問題