我正在尝试编写自己的在迁移过程中运行的timestamps方法。现在已经存在的那个在字段上添加了一个NOT_NULL约束,我真的不想要那个。

我的问题是我有一个多模式的数据库。每个主要客户在哪里都有自己的架构。当我们加入新客户时,我们会创建一个新的租户记录,然后为新创建的架构运行迁移。

新模式应该是其他模式中表的精确副本,当然不包含任何数据。

我进行的最后一次迁移使用的是旧版本的Rails。仍在3年代,但年龄稍大一些。创建时间戳时,它们可以为NULL。
当我第二天(在新的 rails 上)进行迁移时...现在所有字段都为NOT_NULL

我有一些开发的代码,其思想是,update_at仅在记录更新时填充,而不是在创建记录时填充。 (第三方应用程序和数据库“功能”创建记录)。
创建记录的第三方应用程序和数据库功能属于新架构。
我已经进入并手动删除了所有表上的所有NOT_NULL约束,但是我不想将清除操作直接写入迁移任务中,因此可以纠正所有将来的表。

我认为最好的办法是覆盖已更改的timestamps方法,改回不会破坏现有代码的方法。

因此,这就是我需要还原/覆盖的原因。
我现在的问题是...如何覆盖该方法。我看不到清晰的类路径,也不确定如何覆盖它。

最佳答案

把它放到一个猴子补丁中……很容易!

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition
  def timestamps(*args)
    options = args.extract_options!
    column(:created_at, :datetime, options)
    column(:updated_at, :datetime, options)
  end
end

正如马涅克所说。由于此“修复”,将忽略对rails的更新。

但是他的最初奉献是一样的。另外,为了适应他的解决方案,您需要回顾所有的迁移过程,并用新代码替换“时间戳”。此外,您还必须替换所有将来自动生成的迁移。

我认为这不适合DRY。也不适合SPOT。

只是B小心!

10-05 20:42
查看更多