我正在尝试编写自己的时间戳方法,该方法在迁移期间运行。现在的那个现在在字段上添加了一个NOT_NULL约束,我真的真的不希望这样。
我遇到的问题是我有一个多架构的数据库。每个主要客户都获得自己的架构。当我们在新客户端上运行时,我们会创建一个新的租户记录,然后为新创建的架构运行迁移。
新模式应该是其他模式中表的精确副本,当然除了没有数据。
我上次运行的迁移是使用较旧版本的rails。仍然在3年代,但一个年长的微笑。当它创建时间戳时,它们是NULLable。 当我在前一天运行迁移时(在新的轨道上)......所有字段现在都是NOT_NULL
我开发的代码是这样的想法,即只在更新记录时才填充updated_at ...而不是在创建记录时。 (第三方应用程序和数据库“函数”创建记录).. 创建记录的第三方应用程序和数据库函数正在落在新架构上...... 我已经进入并手动删除了所有表上的所有NOT_NULL约束,但我不想将清理直接写入我的迁移任务中,以便将来所有表都得到纠正..
我认为最好的办法是覆盖已更改的timestamps方法,回到没有破坏现有代码的方法。
所以我需要恢复/覆盖... 我现在的问题是......如何覆盖方法。我看不到它的明确的类路径,我不确定如何覆盖它..
答案 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