数据库中的rails模型验证

时间:2011-09-23 15:26:25

标签: ruby-on-rails model-validation

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

创建表帖子( 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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

创建记录时,会执行检查以确保不记录   记录存在于数据库中,具有指定的给定值   attribute(映射到列)。当记录更新时,   进行同样的检查,但无视记录本身。

     

因为此检查是在数据库外部执行的,所以仍然存在   重复值将以两个并行方式插入的可能性   交易。为了保证不这一点,你应该创造一个独特的   该领域的指数。有关详细信息,请参阅add_index。

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

答案 3 :(得分:0)

Michael Hartl Rails教程涵盖了唯一性验证(例如“电子邮件”字段)here。看来完整的唯一性解决方案是:

  1. :uniqueness验证添加到模型中。
  2. 使用迁移将唯一索引添加到数据库。
  3. 捕获控制器中的DB错误。 Michael的例子是Insoshi people_controller - 搜索rescue ActiveRecord::StatementInvalid语句。
  4. 重新。 #3,看起来迈克尔只是重定向到任何数据库语句异常的主页,所以它不像@Ransom Briggs所建议的解析那么复杂(也不准确),但是如果正如@Omar Qureshi所说的那样可能就足够了,唯一性约束涵盖了99%的案例。