ruby-on-rails - Rails 唯一列有重复项

标签 ruby-on-rails ruby validation postgresql

这是我模型的精简版。

model Paper
  PAPER_STARTING_NUMBER = 1

  validate_uniqueness_of :number, :allow_blank => true
  before_create :alocate_paper_number

  def alocate_paper_number
    return true if self.number.present?
    p_number = Paper.maximum('number') || Paper::PAPER_STARTING_NUMBER 
    self.number = p_number >= Paper::PAPER_STARTING_NUMBER ? p_number+1 : Paper::PAPER_STARTING_NUMBER 
    return true 
  end
end

问题是我在数字列中有重复项。 关于为什么以及如何在不更改回调的情况下解决此问题的任何想法。 我知道我可以在数据库上添加唯一性验证或在该列上创建序列,还有其他想法吗?

最佳答案

首先你必须了解回调的顺序:

(-) 保存

(-) 有效

(1) 验证前

(-) 验证

(2) after_validation

(3) 保存前

(4) before_create

(-) 创建

(5) 创建后

(6) 保存后

(7) 提交后

如您所见,它验证了您的 number 属性的唯一性,然后 before_create 可以根据自己的意愿违背验证想要完成的目标。

关于更简洁的架构,我会将这两个想法放在您的自定义模型中,因为用户似乎无法选择数字。它只是一个增量器,对吧?

def alocate_paper_number
  p_number = Paper.maximum('number') || Paper::PAPER_STARTING_NUMBER 
  self.number = p_number + 1
end

仅该代码段就可以防止重复,因为它总是向上递增(除非,数字有可能以我不知道的另一种方式出现),而且也没有理由返回所有这些 true。千真万确!

关于ruby-on-rails - Rails 唯一列有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11931049/

相关文章:

python - 单元测试通过了 Django 中模型的正则表达式验证器

ruby-on-rails - 我的抓取 "stack"应该如何处理 404 错误?

ruby-on-rails - 在现有的 Ruby on Rails 应用程序中创建博客

ruby-on-rails - 从 Heroku 上的 Rails 下载流式 ZIP 文件导致内存使用量增加

ruby-on-rails - 使用 Rails 作为 REST API 时如何处理多对多记录

r - 使用一组规则的多列方差

javascript - "+var === +var"在内部如何工作以验证 var 是否为数字?

ruby-on-rails - Rails 有多种条件

ruby - FactoryBot 构建具有特征的对象列表

ruby - 使用 Rake 从 YAML 文件加载我的数据库,我可以设置环境吗?