防止重复保存在活动记录中,并返回重复的对象

我在我的数据库中存在一些重复记录的问题,我认为这是由人们多次点击提交引起的。 我正在使用Rails 3。

返回重复的对象而不是false

我希望能够防止将重复项添加到我的数据库中,但是如果在保存副本时返回了重复的对象而不是false,则更愿意。 原因是如果有人多次点击提交,我希望他们被带到一个页面,显示他们首先提交的项目,而不是错误页面。

重复的定义

我将副本定义为一个项目,其中除ID之外的所有字段都相同,并且created_at> Time.now – 1.minute

没有JavaScript

我宁愿做这个服务器端,而不是仅仅禁用JavaScript中的按钮,因为我不认为数据库完整性是客户端工作。 此外,感觉它应该在模型中完成,而不是控制器。 我正在运行多个乘客,所以任何解决方案都应该尽可能地避免并发问题。 一些边缘案例重复不会打破网站。

谢谢。

ActiveRecord解决方案

ActiveRecord有动态查找器的概念:

User.find_or_create_by_first_name_and_last_name_and_age_and_whatelse(first_name, last_name, age, whatelse) 

不知道如何在这里放置“最后一刻”逻辑。

替代解决方案

我会粗略地这样做:

  1. 在用户单击插入新记录。 记住它的身份。

  2. 检查最后一分钟是否已发布类似记录。

  3. 如果有一个(或几个),删除新记录,获取并返回最旧的记录。

  4. 如果没有现有记录,则返回新记录。

它比“先检查,然后插入”更好,因为它避免了竞争条件。

但是,它会在id序列中产生一些空白。 有些人不喜欢这样。 🙂