簡體   English   中英

Rails / Ruby如何覆蓋遷移方法的時間戳

[英]Rails/Ruby How do I override the migration method timestamps

我正在嘗試編寫自己的在遷移過程中運行的timestamps方法。 現在已經存在的那個在字段上添加了一個NOT_NULL約束,我真的不想要那個。

我的問題是我有一個多模式數據庫。 每個主要客戶在哪里都有自己的架構。 當我們加入新客戶時,我們會創建一個新的租戶記錄,然后為新創建的架構運行遷移。

新模式應該是其他模式中表的精確副本,當然沒有數據。

我進行的最后一次遷移使用的是舊版本的Rails。 仍在3年代,但年齡稍大一些。 創建時間戳時,它們可以為NULL。 當我第二天(在新的軌道上)進行遷移時...現在所有字段都為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的更新。

但是他的最初報價還是一樣。 另外,為了適應他的修復,您需要重新進行ol'遷移,並用新代碼替換“時間戳”。 此外,您還必須替換所有將來自動生成的遷移。

我認為這不適合DRY。也不適合SPOT。

只是B小心!

有什么問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM