1

我有一张表,并在表中验证了唯一性设置。例如。

创建表帖子(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE,title varchar(255) unique,内容文本);

这里的标题是独一无二的。是否还需要告知模型类这种独特性?如果不是当我插入重复的标题时,它会给我错误。我怎么抓住它。目前,rails 向我显示了回溯,我无法输入自己的错误消息

def create
  @f = Post.new(params[:post])
  if @f.save
    redirect_to posts_path
  else
    @flash['message'] = "Duplicated title"
    render :action=>'new'
  end 
end 

我没有被重定向到新的,而是显示了一个很大的回溯。

4

4 回答 4

2

使用validates_uniqueness_of验证。“创建记录时,将执行检查以确保数据库中不存在具有指定属性(映射到列)的给定值的记录”

于 2011-09-23T15:29:05.393 回答
0

Michael Hartl Rails 教程在这里介绍了唯一性验证(关于“电子邮件”字段) 。看来完整的唯一性解决方案是:

  1. :uniqueness验证添加到模型。
  2. 使用迁移将唯一索引添加到数据库。
  3. 捕获控制器中的 DB 错误。Michael 的示例是Insoshi people_controller --searchrescue ActiveRecord::StatementInvalid语句。

回覆。#3,看起来 Michael 只是在任何 DB 语句异常上重定向到主页,所以它不像 @Ransom Briggs 建议的解析那样复杂(也不准确),但如果像 @Omar Qureshi 所说的那样,这可能就足够了,唯一性约束覆盖了 99% 的情况。

于 2011-10-15T00:17:19.370 回答
0

您必须将所有验证添加到您的模型中。有一个名为 schema_validations 的 gem,它将检查您的数据库以进行验证,并为您在模型中创建它们。 https://github.com/lomba/schema_validations

于 2011-09-23T16:23:57.670 回答
0

是的,您按照其他答案中的说明进行操作,答案是 validate_uniqueness_of - http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086。请注意,即使您在模型中进行了验证,也确实存在竞争条件,Rails 可能会尝试执行两次插入而不知道表中已经存在唯一记录

创建记录时,将执行检查以确保数据库中不存在具有指定属性(映射到列)的给定值的记录。更新记录时,会进行相同的检查,但不考虑记录本身。

由于此检查是在数据库之外执行的,因此仍有可能在两个并行事务中插入重复值。为了保证这一点,您应该在该字段上创建一个唯一索引。有关详细信息,请参阅 add_index。

因此,您所做的通过在数据库上创建唯一索引是正确的,尽管您可能会在异常日志中获得数据库驱动程序异常。有一些解决方法,例如检测何时发生插入(通过双击)。

于 2011-09-23T16:31:53.923 回答