在我在我的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