这是我模型的精简版。
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/