我在两个表之间有has_and_belongs_to_many
个关系:users
和roles
。
当我添加到连接表时,如何防止重复,因此同一角色中的同一用户不能添加两次(比如查看该行是否已存在)。我知道有一个find
功能,但我不认为这就是我要找的东西。任何帮助将不胜感激。
role = Role.find(params[:role_id])
user = User.find(params[:user_id])
role.users << user
答案 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是一个很好的诱因...