【发布时间】:2022-12-11 11:28:00
【问题描述】:
我正在尝试使用唯一性约束来管理 HABTM 关系。
IE。我想让我的User
has_and_belongs_to_many :tokens
但我不希望同一令牌多次与给定用户相关联。
我在连接表上放了一个唯一索引
add_index users_tokens [:user_id, :token_id], unique: true
如果代码尝试多次向给定用户添加相同的令牌,这会正确地导致抛出 ActiveRecord::RecordNotUnique 异常。
在我的代码中,我希望只是默默地捕获/吞下这个异常,就像这样:
begin
user << token
rescue ActiveRecord::RecordNotUnique
# nothing to do here since the user already has the token
end
但是,我遇到了一个问题,当我的用户对象被修改为其他内容时,我的代码中稍后会抛出 RecordNotUnique 异常。
所以一些代码调用类似
...
# The following line throws ActiveRecord::RecordNotUnique
# for user_tokens, even though
# we are not doing anything with tokens here:
user.update_counters
就好像协会记得它是“脏的”或未保存的,然后尝试保存之前没有保存的记录,并最终抛出异常。
有什么想法可以查看关联是否真的认为它是脏的,和/或当我捕获到异常时如何重置其“脏”状态?
【问题讨论】:
-
这个问题不是很清楚。我认为您需要阐明您希望实现的目标,并向我们展示未按照您的预期执行的代码。您是否尝试将非唯一的
Token添加到User并且您是否使用<<运算符来执行此操作?当你这样做时,你期望发生什么? -
谢谢@Toby1Kenobi - 让我知道这是否感觉更清楚一点?
-
您是否有镜像数据库约束的验证?让 Rails 在只响应数据库错误之前通过验证更早地发现问题。
-
@hbhanoo 谢谢,虽然
user << token更好,但我想你的意思是user.tokens << already_connected_token
标签: ruby-on-rails activerecord