0

我有一个 list_users 模型,其中包含连接用户 w 列表的字段(id、list_id、user_id)。

在我的列表导轨模型中,我进行了以下验证以防止重复。

  validates_uniqueness_of :user_id, :scope => :list_id

然而,时不时地在数据库的 list_users 表中创建重复记录,这最终会破坏很多东西......

=> [#<ListMember id: 37199, user_id: 1203713, list_id: 13651, created_at: "2012-06-04 20:02:11", updated_at: "2012-06-04 20:02:11">

=> [#<ListMember id: 37195, user_id: 1203713, list_id: 13651, created_at: "2012-06-04 20:01:40", updated_at: "2012-06-04 20:01:40">

有没有人见过这个?谢谢

4

2 回答 2

2

我对 Rails 部分无能为力,但您应该在数据库级别添加一个唯一索引:

ALTER TABLE list_users ADD UNIQUE (list_id, user_id)

也许它会帮助您诊断 Rails 代码中的错误。

于 2012-06-14T00:28:51.147 回答
2

我以前见过这个。我不知道你的上下文是否相同,但我看到这个的原因基本上是我不小心在内存中构建了两个具有相同 id 对的记录,对它们两个运行验证,然后保存都到数据库。唯一性验证没有捕捉到这一点,因为在运行验证时数据库中不存在任何记录。也许这就是你正在经历的。

编辑:看到您的记录创建时间有多接近,我会说这很可能是这种情况。

此外,您应该将索引迁移到数据库add_index :list_users, [:user_id, :list_id]

于 2012-06-14T00:22:59.493 回答