Возникли проблемы с :pendent =>: destroy и before_filter - PullRequest
0 голосов
/ 12 октября 2009

Две модели: модель учетной записи (has_many: users) и модель User (own_to: account,: related =>: destroy).

Модель «Мой пользователь» имеет следующее:

def protect_master_user
  unless User.find_all_by_account_id_and_is_master(self.account_id, true).count > 1
    false
  end
end

Я пытаюсь защитить главных пользователей от удаления. Как я могу переопределить это, если родитель (Аккаунт) удален? Я пытался: зависимый =>: уничтожить и: удалить безрезультатно.

РЕДАКТИРОВАТЬ: фиксированный код.

Ответы [ 2 ]

1 голос
/ 12 октября 2009

Есть два способа сделать это: has_many: users,: related =>: delete_all или с дополнительным настраиваемым обратным вызовом в Аккаунтах. Метод: delete_all более прост, но не рекомендуется, потому что это означает, что ни один из ваших других обратных вызовов не произойдет в пользовательской записи.

Правильным решением является пользовательский обратный вызов before_destroy в учетной записи, работающий в тандеме с обратным вызовом пользователя.

class Account < ActiveRecord::Base
  has_many :users 

  before_destroy :destroy_users
  protected
    def destroy_users
      users.each do |user|
        u.account_id = nil
        u.destroy
      end
    end

end

class User < ActiveRecord::Base
  belongs_to :account

  before_destroy :protect_master_user

  protected
    def protect_master_user
      unless account_id.nil? ||! master || 
        User.find_all_by_account_id_and_master(self.account_id, true).count > 1
        errors.add_to_base "Cannot remove master user."
        return false
      end
    end
end

Если account.id равен нулю, мы закорачиваем "если" и уничтожение продолжается. То же самое касается, если пользователь не является основным пользователем. Зачем нам проверять, есть ли более одного главного пользователя, если уничтожаемый объект также не является основным пользователем?

Опять же, удаление может быть использовано вместо уничтожения. Но он пропускает любые * _deroy обратные вызовы, которые у вас есть или будут в будущем.

0 голосов
/ 14 февраля 2013

Недавно у меня возник тот же вопрос и загадка, и я нашел, что лучший способ справиться с этим - это обработать его в контроллере, так как мне действительно важно, если пользователь пытается удалить последнего главного пользователя, а не систему делаем это:

   class UsersController < ApplicationController
     def destroy  
       user = current_account.users.find(params[:id].to_i)
       if allow_removal_of_user?(user) && user.destroy
         redirect_to users_path, :notice => "User sucessfully deleted"
       else 
         flash[:error] = user.errors.empty? ? "Error" : user.errors.full_messages.to_sentence
         render :edit
       end 
     end 

   private
     def allow_removal_of_user?(user)
       if user == current_user
         errors.add(:user_removal, "Can't delete yourself")
         false
       elsif user.only_user? || (user.master_users_for_account.count == 1 && user.master_role?)
         errors.add(:user_removal, "Can't delete last Master user")
         false
       else
         true
       end
     end
   end

Надеюсь, это кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...