当我们在ActiveRecord的一个字段中有了一个新范围时,是否可以立即更改验证代码?

非极性

说,如果我们有

class SomeData < ActiveRecord::Base
  validates :foo, inclusion: 33..99

现在,我们说,我们将范围缩小到66..99,但是数据库中有许多值仍在33到65之间,可以将上面的代码更改为

class SomeData < ActiveRecord::Base
  validates :foo, inclusion: 66..99

立即?如果只是将数据读入系统是否有问题?(甚至在Rails的早期版本中,例如3.2?)

最高

更改验证实际上并不会以任何方式直接影响数据库中的现有数据。只有#valid?在模型上调用时,才运行验证

调用时隐式发生:

  • .create.create!
  • #save#save!
  • #update#update!

并且它导致这些方法无法使用,因此要么发生回滚,要么首先不触发任何数据库查询。

我们可以立即更改验证吗?

是。仅当您尝试更新现有记录时,验证才会真正生效。在这种情况下,以前有效的记录现在可能无效。除非将值更新为新的允许范围,否则这将不允许更新。

处理旧数据

如果要让用户仍然根据新规则使用无效数据来更新现有记录,则有一些服务器技巧。

if:unless:选项

class SomeData < ActiveRecord::Base
  validates :foo, inclusion: 33..99, if: :legacy_record?
  validates :foo, inclusion: 66..99, unless: :legacy_record?
end

有几种方法可以实现:legacy_record?数据库中的布尔标志。请注意,这些不应与ruby关键字混淆。它们只是哈希选项。

自定义验证方法:

class SomeData < ActiveRecord::Base
  validate :my_validation_method
  def my_validation_method
    rng = legacy_record? ? 33..99 : 66..99
    errors.add(:foo, "out of range") unless rng.cover?(foo)
  end
end

单表继承

class Thing < ActiveRecord::Base
  validates :foo, inclusion: 66..99
end

class LegacyThing < ActiveRecord::Base
  self.table_name = "things"
  validates :foo, inclusion: 33..99
end

在此示例中,您将添加things.typevarchar列,并使用来更新现有行things.type = "LegacyThing"这并不是真正的STI,它只是使用ActiveRecord内置的机制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以根据另一个字段的值来更改一个字段的字体颜色吗?

来自分类Dev

如果我在Sitecore的基本模板中有一个字段,是否可以根据继承它的页面模板来更改其标题?

来自分类Dev

ReactJS:我们可以在一个文本字段中有两个onChange吗?

来自分类Dev

我在phpmyadmin表中有一个记录列表,我想更改所有记录中一个字段的值

来自分类Dev

添加新行但更改一个字段

来自分类Dev

当我们向输入字段提供输入时,为什么PhantomJS仅输入最后一个字母?

来自分类Dev

当我们向输入字段提供输入时,为什么PhantomJS仅输入最后一个字母?

来自分类Dev

当我们可以看到一个简单的 vb6 压缩 dll 时

来自分类Dev

我们可以在Java中有一个AtomicEnum吗?

来自分类Dev

当我输入一个字段时,它会自动输入另一个字段

来自分类Dev

当我们释放一个按钮时,如何触发一个事件?

来自分类Dev

当我们有一个红色区域时,为什么我们需要堆栈分配?

来自分类Dev

当我们有一个红色区域时,为什么我们需要堆栈分配?

来自分类Dev

当我们在结构内部有一个指针时,container_of宏

来自分类Dev

当我们只有一个片段时处理 `BackPressed`

来自分类Dev

当一个字符中有多个字符时,如何只更改一个字符?

来自分类Dev

验证一个字段是否存在且有效

来自分类Dev

我们可以在 PHP 函数中返回一个字符串吗?

来自分类Dev

当我们在另一个 ul 标签中有 ul 标签时,如何修复 html2pdf 中的错误?

来自分类Dev

我们如何使用腻子平台发送一个字节的数据

来自分类Dev

MySQL中有两个引用的一个字段

来自分类Dev

当我有一个私有id字段时,为什么Hibernate要求我们实现equals / hashcode方法?

来自分类Dev

一个字段中有多个文本字段

来自分类Dev

我们在中有一个cultureinfo类。NET,Node js中是否有类似的结构/包?

来自分类Dev

在PHP中是否有一个等效的“ @”?就像我们在C#中有@“ C:\ Users \ Documents”

来自分类Dev

每当一个或另一个字段使用Angular指令更改模型(每次击键)时,验证密码并确认密码字段

来自分类Dev

每当一个或另一个字段使用Angular指令更改模型(每次击键)时,都要验证密码并确认密码字段

来自分类Dev

在一个字段上多次验证

来自分类Dev

在Java中有多少构造函数可以我们一个类中创建?

Related 相关文章

  1. 1

    我们可以根据另一个字段的值来更改一个字段的字体颜色吗?

  2. 2

    如果我在Sitecore的基本模板中有一个字段,是否可以根据继承它的页面模板来更改其标题?

  3. 3

    ReactJS:我们可以在一个文本字段中有两个onChange吗?

  4. 4

    我在phpmyadmin表中有一个记录列表,我想更改所有记录中一个字段的值

  5. 5

    添加新行但更改一个字段

  6. 6

    当我们向输入字段提供输入时,为什么PhantomJS仅输入最后一个字母?

  7. 7

    当我们向输入字段提供输入时,为什么PhantomJS仅输入最后一个字母?

  8. 8

    当我们可以看到一个简单的 vb6 压缩 dll 时

  9. 9

    我们可以在Java中有一个AtomicEnum吗?

  10. 10

    当我输入一个字段时,它会自动输入另一个字段

  11. 11

    当我们释放一个按钮时,如何触发一个事件?

  12. 12

    当我们有一个红色区域时,为什么我们需要堆栈分配?

  13. 13

    当我们有一个红色区域时,为什么我们需要堆栈分配?

  14. 14

    当我们在结构内部有一个指针时,container_of宏

  15. 15

    当我们只有一个片段时处理 `BackPressed`

  16. 16

    当一个字符中有多个字符时,如何只更改一个字符?

  17. 17

    验证一个字段是否存在且有效

  18. 18

    我们可以在 PHP 函数中返回一个字符串吗?

  19. 19

    当我们在另一个 ul 标签中有 ul 标签时,如何修复 html2pdf 中的错误?

  20. 20

    我们如何使用腻子平台发送一个字节的数据

  21. 21

    MySQL中有两个引用的一个字段

  22. 22

    当我有一个私有id字段时,为什么Hibernate要求我们实现equals / hashcode方法?

  23. 23

    一个字段中有多个文本字段

  24. 24

    我们在中有一个cultureinfo类。NET,Node js中是否有类似的结构/包?

  25. 25

    在PHP中是否有一个等效的“ @”?就像我们在C#中有@“ C:\ Users \ Documents”

  26. 26

    每当一个或另一个字段使用Angular指令更改模型(每次击键)时,验证密码并确认密码字段

  27. 27

    每当一个或另一个字段使用Angular指令更改模型(每次击键)时,都要验证密码并确认密码字段

  28. 28

    在一个字段上多次验证

  29. 29

    在Java中有多少构造函数可以我们一个类中创建?

热门标签

归档