Rails / Ruby如何覆盖迁移方法时间戳

时间:2013-03-22 01:33:54

标签: ruby-on-rails override classpath timestamp

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

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

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

我上次运行的迁移是使用较旧版本的rails。仍然在3年代,但一个年长的微笑。当它创建时间戳时,它们是NULLable。 当我在前一天运行迁移时(在新的轨道上)......所有字段现在都是NOT_NULL

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

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

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

2 个答案:

答案 0 :(得分: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小心!

答案 1 :(得分:1)

出了什么问题:

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