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 }
...

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

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

非常感谢。

4

5 回答 5

8

在记录进入数据库之前,Rails 会完成验证。如果记录未通过验证,它将不会保存,.save并将返回false,这将导致else您的控制器的子句执行。该子句通常会重新呈现已提交的页面,并显示错误以便更正它们。

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

于 2013-05-24T12:57:10.370 回答
7

在数据库中添加唯一索引。这样,如果模型验证中出现问题(很少见,但在技术上是可行的),保存到数据库的查询将失败。

于 2013-05-24T13:06:58.243 回答
6

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

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly.
于 2013-05-24T12:56:57.407 回答
4

您的验证是正确的。就像上面的所有其他答案一样,但是假设您要验证多个字段,例如假设您有一个愿望清单,它带有user_iditem_id,您需要每个项目只由用户添加一次,对于这种情况添加这个模型的验证类型

Class class_name < ActiveRecord::Base
  validates_uniqueness_of   :item_id, scope: :user_id
end
于 2016-07-15T12:01:28.783 回答
3

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

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

于 2013-05-24T13:04:02.627 回答