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

vatpfxk5  于 12个月前  发布在  Ruby
关注(0)|答案(5)|浏览(112)

在我的模型中,我有这个:

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

如果表中还没有具有此名称的记录,则会成功创建一条记录。我认为在插入可能重复的记录之前进行检查而不是依赖于DB约束是一个很好的做法。
我想我应该在控制器上添加一些东西来检查一下。做这件事的正确方法是什么?
非常感谢。

oipij1gg

oipij1gg1#

Rails在记录到达数据库之前进行验证。如果记录验证失败,它将不会保存,.save将返回false,这将导致控制器的else子句执行。该子句通常会重新呈现已提交的页面,并显示错误以便更正。
假设你的控制器是这样构建的,你不需要做任何其他的事情。当然,您应该确保所有数据库约束都反映在验证中,否则记录可能通过验证,但在保存时由于违反约束而产生错误。

xxslljrj

xxslljrj2#

在数据库中添加唯一索引。这样,如果有什么东西通过了模型验证(很少,但在技术上是可能的),那么保存到数据库的查询就会失败。

nukf8bse

nukf8bse3#

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

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

jk9hmnmh4#

您的验证是正确的。就像上面的所有其他答案一样,但是假设您想要验证多个字段(例如假设您有一个wishlist,它接受user_iditem_id),您需要每个项目仅由用户添加一次,对于这种情况,将这种类型的验证添加到模型中

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

xghobddn5#

在Rails中,验证唯一性的正确方法是通过验证。你不需要在控制器中检查这个,因为这是验证为你做的。
请记住,添加唯一性验证并不能保证数据库中的记录是唯一的。这在API的validates_unique_of文档中有很好的解释。

相关问题