5

我正在尝试编写自己的时间戳方法,该方法在迁移期间运行。现在到位的那个在字段上添加了一个 NOT_NULL 约束,我真的不想要那个。

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

新模式应该是其他模式中表的精确副本,当然除了没有数据。

我运行的最后一次迁移是使用稍旧版本的 rails。仍然在 3 岁,但年龄稍大。当它创建时间戳时,它们可以为空。前几天我运行迁移时(在新的轨道上)......现在所有字段都是 NOT_NULL

我有这样的想法开发的代码,updated_at 仅在记录更新时填充......而不是在创建时填充。(第三方应用程序和数据库“函数”创建记录)..创建记录的第三方应用程序和数据库函数正在落在新模式上......我已经进入并删除了所有表上的所有 NOT_NULL 约束手动,但我不想将清理工作直接写入我的迁移任务中,以便更正所有未来的表。

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

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

4

2 回答 2

4

把它放在猴子补丁中......简单!

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小心!

于 2013-03-25T05:21:01.327 回答
1

有什么问题:

create_table :foo do |t|
   t.text :bar
   t.datetime :created_at
   t.datetime :updated_at
end

?

于 2013-03-24T22:03:58.457 回答