Rails的初始化器在運行任何rake任務(包括db:migrate
和db:seed
)時運行是非常令人驚訝的。Rails初始化器在遷移數據庫時運行
我的應用程序中的初始化程序啓動後臺線程(一種工作進程),只有當應用程序在調試和生產模式下運行時才應執行它。
如何在執行rake db:migrate
時阻止運行特定的初始化程序或如何在初始化程序中檢測到rake任務正在運行?
Rails的初始化器在運行任何rake任務(包括db:migrate
和db:seed
)時運行是非常令人驚訝的。Rails初始化器在遷移數據庫時運行
我的應用程序中的初始化程序啓動後臺線程(一種工作進程),只有當應用程序在調試和生產模式下運行時才應執行它。
如何在執行rake db:migrate
時阻止運行特定的初始化程序或如何在初始化程序中檢測到rake任務正在運行?
這裏是一個解決方案如何防止初始化從Rake任務運行:
unless (File.basename($0) == 'rake')
# Initializer code
end
這個_obviously_取決於用「rake」調用它。如果您開始對命令「rails db:migrate」使用「rails」或其他類型,則這不起作用。 – traday
遷移需要加載您的環境,初始值設定項是環境的一個組成部分。如果您需要初始化程序在遷移期間不運行,那麼它可能位於錯誤的地方。
如果你不能將它移動到其他地方,那麼也許這個答案(create a 'fast migrate' rake task)將有所幫助。
馬特,這是「其他地方」是什麼?要求:我需要在應用程序啓動時運行線程,並且在遷移時不需要它。在哪裏放置線程啓動不必處理額外的命令行參數,就像在有關快速遷移的答案中一樣? – Paul
如果你的初始化依賴於特定表的科銳,一個選擇是使用ActiveRecord::Base.connection.table_exists? :mytable
檢查。
遷移需要加載您的環境,初始化程序是環境的一個組成部分。如果您需要初始化程序在遷移期間不運行,那麼它可能位於錯誤的地方。 – Matt