在我在我的ActiveRecords使用Ruby的工作流程使用寶石:WorkflowRuby的工作流程問題遷移
現有運行代碼包含:
- 我有一個ActiveRecord:X
- 我有已遷移兩次:
- (Ref1) CreateX migration(它創建表X)
- (REF2) CreateInitialEntryInX遷移(在表X創建一個條目)
新變化:
- 現在,我想補充的工作流程在ActiveRecord X中,因此我做了:
- (REF3)我增加了工作流代碼中的ActiveRecord型號X(提的是:地位,我的工作流場)
- (至Ref4) AddStatusFieldToX遷移(添加:在表X狀態字段)
現在,當我運行rake db:遷移後發生更改時,(Ref2) break cos遷移查找:狀態字段,因爲它在工作流程部分的ActiveRecord模型中提到,但是:status字段尚未添加爲遷移(Ref4)尚未執行。
因此,當所有遷移按順序運行時,所有構建失敗,對此的任何解決方案? 我不想重新排序任何遷移或編輯任何舊的現有遷移。
我的模型看起來像:
class BaseModel < ActiveRecord::Base
#
# Workflow to define states of Role
#
# Initial State => Active
#
# # State Diagram::
# Active --soft_delete--> Deleted
# Deleted
#
# * activate, soft_delete are the event which triggers the state transition
#
include Workflow
workflow_column :status
workflow do
state :active, X_MODEL_STATES::ACTIVE do
event :soft_delete, transitions_to: :deleted
end
state :deleted, X_MODEL_STATES::DELETED
on_transition do |from, to, event, *event_args|
self.update_attribute(:status, to)
end
end
def trigger_event(event)
begin
case event.to_i
when X_MODEL_EVENTS::ACTIVATE
self.activate!
when X_MODEL_EVENTS::SOFT_DELETE
self.soft_delete!
end
rescue ....
end
end
class X_MODEL_STATES
ACTIVE = 1
DELETED = 2
end
class X_MODEL_EVENTS
ACTIVATE = 1
SOFT_DELETE = 2
end
# Migrations(posting Up functions only - in correct sequence)
#--------------------------------------------------
#1st: Migration - This is already existing migration
CreateX < ActiveRecord::Migration
def up
create_table :xs do |t|
t.string :name
t.timestamps null: false
end
end
end
#2nd: Migration - This is already existing migration
CreateInitialX < ActiveRecord::Migration
def up
X.create({:name => 'Kartik'})
end
end
#3rd: Migration - This is a new migration
AddStatusToX < ActiveRecord::Migration
def up
add_column :xs, :status, :integer
x.all.each do |x_instance|
x.status = X_MODEL_STATES::ACTIVE
x.save!
end
end
end
所以,當遷移#2運行時,它試圖找到:狀態字段寫是的X_MODEL_STATES::ACTIVE
初始值,因爲它是在Active Record的模型文件中提到工作流程爲:workflow_column :status
並且未找到該字段爲遷移#3尚未執行。
請張貼一些代碼和實際的例外,也是什麼原因,沒有把正確的順序遷移? – fabriciofreitag
@onionfeelings,因爲早些時候的遷移即Ref1和Ref2已經在生產中,並且自從現在幾個月開始運行。這是由於添加要求而正在進行的遷移。這個問題不會在生產中進行,因爲只有新的遷移將運行。 但是,如果有人分叉代碼並在開發環境中運行,遷移將中斷(我想避免) – kattybilly
你可以發佈你的代碼嗎?理論上,如果你這樣做: add_column:TABLE_X,:STATUS_ID,:整數 你不應該有任何問題,並且仍然Rails會正確處理的關聯,因爲你下面的約定 – fabriciofreitag