关联类之间的删除

时间:2011-09-10 13:11:27

标签: ruby associations

我有几个关联的类如下:

class User < ActiveRecord::Base
   has_many :posts, :dependent => :destroy

class Group < ActiveRecord::Base
   has_many :posts, :dependent => :destroy

class Post < ActiveRecord::Base
   belongs_to :user
   belongs_to :groups

现在,我想通过将“活动”字段设置为false来删除用户,组和帖子,并将它们保留在数据库中。最初,我希望破坏用户或组会导致他们的帖子被破坏(删除操作会将标志设置为false),但据我所知,在这种情况下,Ruby只会在不破坏帖子的情况下中断相应的关联。我想知道它是否可以很好地完成,或者我只需要编写一个单独的函数并调用它而不是常规删除?

1 个答案:

答案 0 :(得分:1)

我们可以通过一些代码和配置来淘汰它们,而不是从数据库中删除记录。

  1. 在app /目录下创建一个名为“Concerses”的新目录。

  2. 在此目录中创建一个名为“retireable.rb”的新文件。

  3. 将以下代码复制并粘贴到其中:

    module Retireable
      extend ActiveSupport::Concern
    
      included do
        default_scope   :conditions => { :retired => false }
        scope :retired, :conditions => { :retired => true }
      end
    
      def destroy
        retire
      end
      def destroy!
        raise StandardError, "Cannot destroy!"
      end
    
      def retire
        update_attribute :retired,    true
        update_attribute :retired_at, Time.now
      end
      def retired?
        retired
      end
    end
    
  4. 4)每个需要此功能的模型必须:

    4a)在数据库模式中使用'retired'布尔字段和'retired_at'datetime字段。

    4b)include Retireable必须在该模型的类定义范围内;即。

        class User < ActiveRecord::Base
          include Retireable
          ...
    

    5)在“config/application.rb”中添加以下行:

        config.autoload_paths << "#{Rails.root}/app/concerns"
    

    现在对instance.destroy(例如@ user.destroy,@ group.destroy)的调用将由可退出处理,因此不会从数据库中删除而不会破坏关联。

    希望有所帮助!