添加验证,以现有的数据库模型

问题描述 投票:0回答:3

我(Ruby on Rails的5)目前正在实施对现有模型的新检验一个初级开发。验证仅当所讨论的属性是不超过50个字更大通行证。

  validates_length_of :reason, maximum: 50, too_long: 'Please reduce to 50 words or less',
                  tokenizer: ->(str) { str.split(/\s+/) }

不幸的是,已经有54条记录在我们的数据库中违反此验证。所以,我在寻找一个解决方案,以确保验证就永远也不会运行这些预先存在的记录。

我的研究,到目前为止已经产生了,这似乎有前途的on: :create的选择,但我想我是否会遇到问题/错误的路线一些有经验的反馈。

这是否会验证选项给我正是我想要的行为?

谢谢乡亲!

ruby-on-rails ruby validation activerecord ruby-on-rails-5
3个回答
1
投票

是的,你是在正确的轨道上,你有几个选择,当谈到与现有数据。

您应该添加到on: create验证,因为你不希望正在改变其他不相关的领域在一个单独的进程的人(或工作)有一个错误,因为原因是无效的,过长。

不过,如果你只添加on: create这意味着有人可以创建少于10个字的理由,然后更新就更新UI到60个字的记录,违反了验证。考虑还加入了与if: :reason_changed?相同的验证,这样可以防止更新打破强加在创建验证规则。

你可以在这种情况下使用的另一种合理的解决方案是对现有记录进行数据迁移,对于每个违反验证记录,你修剪的话到49在末尾添加一个...并保存。这将导致信息丢失但是这将意味着你可以随时申请此验证的时间100%。有时,固定数据是写更少的代码,一个很好的选择。

无论你选择,确保你有测试,以增加你的信心,代码是做你相信是应该做的事情。


0
投票

新的验证是只是针对创建或更新操作运行。这意味着,在数据库中的现有记录将保持原样。换句话说,只要不被更新,因为他们,你将不会遇到任何问题。

这是你想要的吗?或者你想升级时采取让较旧的记录> 50分的话,甚至?如果你真的需要,你可以创建一个新的属性,称为例如遗产,其中设置为true任何现有记录。你可以跳过验证任何遗留的纪录。但我认为这是对的点位。


0
投票

我会做这样的事情:

validates_length_of :reason, maximum: 50,
                             tokenizer: ->(str) { str.split(/\s+/) },
                             too_long: 'Please reduce to 50 words or less',
                             unless: -> { reason_was && reason_was.split(/\s+/).size > 50 }

除非有理由属性先前存在和大于50意味着新唱片从未有一个理由字数大于50,因为他们没有先前的原因值这个执行验证。老记录只能有原因字数大于50,如果它以前是更大的,否则,将应用最大的50。

这使得利用生成通过ActiveModel::Dirty提供的方法的方法。

© www.soinside.com 2019 - 2024. All rights reserved.