Удаление между ассоциированными классами - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть несколько классов, связанных следующим образом:

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 Ответ

1 голос
/ 10 сентября 2011

Вместо того, чтобы удалять записи из базы данных, мы можем удалить их с небольшим количеством кода и конфигурации.

  1. Создайте новый каталог в вашем приложении / каталог под названием «проблемы».

  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) Каждая из ваших моделей, которым требуется эта функция, должна:

4a) иметь логическое поле 'retired' и поле даты / времени * retired_at.в схеме базы данных.

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) будет обрабатываться списанным, поэтому не удаляется из базы данных и не нарушает связь.

Надеюсь, это поможет!

...