gpt4 book ai didi

ruby-on-rails - HABTM-唯一性约束

转载 作者:行者123 更新时间:2023-12-03 13:41:07 24 4
gpt4 key购买 nike

我有两个具有HABTM关系的模型-用户和角色。


用户-has_and_belongs_to_many:roles
角色-属于:user


我想在联接(users_roles表)中添加一个唯一性约束,该约束说user_id和role_id必须是唯一的。在Rails中,如下所示:

validates_uniqueness_of :user, :scope => [:role]


当然,在Rails中,我们通常没有模型来表示HABTM关联中的联接关系。

所以我的问题是添加约束的最佳位置在哪里?

最佳答案

您可以添加唯一性来加入表格

add_index :users_roles, [ :user_id, :role_id ], :unique => true, :name => 'by_user_and_role'


In a join table, what's the best workaround for Rails' absence of a composite key?

然后,数据库将引发一个异常,您必须处理该异常。
在这种情况下,我不知道准备使用Rails验证,但是您可以像这样添加自己的验证:

class User < ActiveRecord::Base
has_and_belongs_to_many :roles, :before_add => :validates_role


我只是默默地放弃数据库调用并报告成功。

def validates_role(role)
raise ActiveRecord::Rollback if self.roles.include? role
end


ActiveRecord :: Rollback是在内部捕获的,但不会重新引发。

编辑

不要在我添加自定义验证的部分使用。可以,但是还有更好的选择。

在关联上使用 :uniq选项,如@Spyros在另一个答案中建议的:

class Parts < ActiveRecord::Base
has_and_belongs_to_many :assemblies, :uniq => true, :read_only => true
end


(此代码段来自Rails Guides v.3)。在 Rails Guides v 3.2.13上查找4.4.2.19:uniq

Rails Guide v.4特别警告不要因为可能的竞争条件而使用 include?检查唯一性。

有关添加索引到联接表的部分仍然存在。

关于ruby-on-rails - HABTM-唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com