3

我有两个模型之间的多对多关系如下:

#users.rb
has_many :users_to_roles
has_many :roles, through: :users_to_roles

#users_to_roles.rb
belongs_to :user
belongs_to :role

#roles.rb
has_many :users_to_roles
has_many :users, through: :users_to_roles

如果有“处于此角色”的用户,我想禁用删除角色。在这里,我找到了两个应该做这项工作的选择:

:restrict_with_exception 如果有任何关联的记录,则会引发异常 :restrict_with_error 如果有任何关联的对象,则会将错误添加到所有者

但是没有关于这个语法以及它应该如何工作的例子。

您能否帮助使其有效:

#roles.rb
has_many :users_to_roles
has_many :users, through: :users_to_roles, dependent: restrict_with_exception
4

4 回答 4

2

或者,您可以在控制器中挽救异常。在此示例中,联系人可能拥有自己的兴趣,即

  class Interest < ActiveRecord::Base
    belongs_to :contact
  end

  class Contact < ActiveRecord::Base
    has_many :interests, :dependent => :restrict
   end

然后在控制器中:

def destroy
    @contact = Contact.find(params[:id])
    begin
        @contact.destroy
    rescue
        flash[:msg] = "Can't delete - owns interest"
    end

   respond_to do |format|
      format.html { redirect_to(:back) }
      format.xml  { head :ok }
    end
end

来电页面会显示闪现信息。

于 2014-08-05T18:59:35.967 回答
2

使用Callbacks可以轻松完成此类操作。就我而言,我在模型中添加了以下方法:

# callbacks
before_destroy :check_for_users_in_this_role

def check_for_users_in_this_role
  status = true
  if self.security_users.count > 0
    self.errors[:deletion_status] = 'Cannot delete security role with active users in it.'
    status = false
  else
    self.errors[:deletion_status] = 'OK.'
  end
  status
end
于 2013-07-01T22:04:33.350 回答
0

我的课程是这样的:

应用程序/模型/guest_chat_token.rb

class GuestChatToken < ApplicationRecord

  has_many :chat_messages, as: :sendable, dependent: :restrict_with_exception

end

应用程序/控制器/管理员/application_controller.rb

class Admin::ApplicationController < ApplicationController
....
    rescue_from ActiveRecord::DeleteRestrictionError do |exception|
            redirect_to :back, notice:
            "Be aware: #{exception.message}."
    end
end
于 2017-05-05T09:41:34.387 回答
0

正确的rails 方法是执行以下操作:

用户.rb:

has_many :users_to_roles, dependant: :destroy # don't keep the join table entry if the user is gone
has_many :roles, through: :users_to_roles

确保您的联接没有冗余条目(其中任一列为空或孤立)。

users_to_roles.rb:

belongs_to :user
belongs_to :role

# add validations presence of both user and role
# in both model and database.

奖励,从 Rails 4.2 开始,您可以forigen_key: true在迁移中添加参考完整性

现在担任您的角色(我假设您单独命名您的模型并在问题中打错字),您添加以下内容:

角色.rb:

has_many :users_to_roles, dependant: :restrict_with_error
has_many :users, through: :users_to_roles
于 2016-06-08T11:30:07.610 回答