Rails中防止重复记录的正确方法

问题描述 投票:0回答:5

在我的模型中我有这个:

validates :name, :presence => true, :uniqueness => true

在我的控制器中,我有:

...
if @location.save
    format.html { redirect_to @location, :notice => 'Location was successfully created.' }
    format.json { render :json => @location, :status => :created }
...

如果表中尚不存在具有此名称的记录,则成功创建记录。我认为在插入可能重复的记录之前进行检查而不是依赖数据库约束是一个很好的做法?

我想我应该在控制器中添加一些东西来检查?正确的做法是什么?

非常感谢。

ruby-on-rails ruby ruby-on-rails-3
5个回答
8
投票

Rails 在记录到达数据库之前完成验证。如果记录验证失败,则不会保存,并且

.save
将返回
false
,这将导致控制器的
else
子句执行。该子句通常会重新呈现已提交的页面,并显示错误,以便可以更正它们。

假设你的控制器是这样构建的,你不需要做任何其他事情。当然,您应该确保任何数据库约束都反映在验证中,否则记录可能会通过验证,但在保存时会因违反约束而产生错误。


7
投票

在数据库中添加唯一索引。这样,如果某些内容未能通过模型验证(很少见,但技术上可行),保存到数据库的查询将会失败。


6
投票

您无需在控制器中执行任何操作。

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly.

4
投票

您的验证是正确的。就像上面的所有其他答案一样,但是假设您想要验证多个字段,例如假设您有一个愿望清单,需要

user_id
item_id
,您需要每个项目仅由用户添加一次,例如这种场景将这种类型的验证添加到您的模型中

Class class_name < ActiveRecord::Base
  validates_uniqueness_of   :item_id, scope: :user_id
end

3
投票

您有在 Rails 中验证唯一性的正确方法,那就是通过验证。您不需要在控制器中检查这一点,因为这就是验证为您所做的事情。

请记住,添加唯一性验证并不能保证您在数据库中拥有唯一的记录。 api 中的validates_uniqueness_of 文档对此进行了很好的解释。

© www.soinside.com 2019 - 2024. All rights reserved.