Has_and_belongs_to_many查找是否存在

时间:2014-01-20 01:20:03

标签: ruby-on-rails

我在两个表之间有has_and_belongs_to_many个关系:usersroles

当我添加到连接表时,如何防止重复,因此同一角色中的同一用户不能添加两次(比如查看该行是否已存在)。我知道有一个find功能,但我不认为这就是我要找的东西。任何帮助将不胜感激。

role = Role.find(params[:role_id])
user = User.find(params[:user_id])
role.users << user

1 个答案:

答案 0 :(得分:3)

在您的habtm声明中添加uniq: true检查会有所帮助 - 它将忽略您的联接表中已存在的重复项:

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users, :uniq => true
end

如果您想首先将重复项保留在连接表之外,则必须将连接表升级为第一类连接模型(并使用has_many-through而不是habtm)声明validate_uniqueness_of,或者您可以坚持使用habtm并提供自定义验证回调:

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users, :before_add => :validate_not_duplicate

  private

  def validate_not_duplicate(user)
    raise 'some error' if users.include? user
  end
end

不幸的是,设置错误标志或返回false不会阻止将模型添加到连接表中 - 您需要引发某种异常。也许这对于一些人来说远离habtm是一个很好的诱因...