Ruby on rails 如何触发:dependent=>;破坏

Ruby on rails 如何触发:dependent=>;破坏,ruby-on-rails,ruby-on-rails-3,dependent-destroy,Ruby On Rails,Ruby On Rails 3,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 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
class用户“created_at DESC”,:dependent=>:destroy,:conditions=>“archive=0”
def销毁
self.archive=1
self.deleted_at=Time.now
自救
结束
结束
类映像true
def销毁
self.archive=1
self.deleted_at=Time.now
自救
结束
结束
现在,如果您看到上面的代码,我将覆盖模型中的destroy调用。当用户正在删除他的帐户时,我不想触发dependent=>destroy回调,以便为映像触发destroy

附言:我不想使用假装偏执或其他插件。我需要触发dependent=>destroy,因为我有一个非常复杂的映射,比如:

用户有很多图片, 有很多评论,, 你有很多爱好, 你有很多活动吗
还有更多9种类型的映射和深度映射等。

您只需要模拟依赖的销毁

在销毁方法中,调用图像的所有销毁方法

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 
class用户“created_at DESC”,:dependent=>:destroy,:conditions=>“archive=0”
def销毁
self.archive=1
self.deleted_at=Time.now
自救
self.images.each(&:销毁)
结束
结束

也许为了让事情变得简单一点,您可以将归档模型和可归档模型的行为封装在模块中:

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
模块可架构
def档案!
self.archive=1
self.deleted_at=Time.now
自救
结束
结束
模块归档器
def销毁
self.archive=1
self.deleted_at=Time.now
存档你的模型!
自救
冻结
结束
def存档模式!
可架构的|模型。每个do |模型|
model\u name=model.name.pluralize.downcase.to\s
self.send(model|u name).each{m | m.archive!}
结束
结束
def可架构的_模型
ActiveRecord::Base.send(:子类)。选择{m | m.method_defined?(:archive!)}
结束
结束
类映像true
结束
类用户“created_at DESC”,:conditions=>“archive=0”,:dependent=>:destroy
可访问属性:名称
结束
这是一个相当黑客式的实现,但它可以工作。如果您按照帖子中的描述添加了注释模型,只需向用户添加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
class用户“created_at DESC”,:conditions=>“archive=0”,:dependent=>:destroy
有很多:注释,:order=>“created_at DESC”,:conditions=>“archive=0”,:dependent=>:destroy
可访问属性:名称
结束
类注释true
结束