在生产环境中迁移时,不会将 Symbol 隐式转换为 Integer
no implicit conversion of Symbol into Integer when migrating in production
所以我正在开发一个现有的应用程序,出于某种原因我能够让它工作并在我的本地环境中进行镜像但是当我尝试在 heroku 上迁移时我收到以下错误,有什么想法吗?
错误:
== 20141119113015 CreateReleasedInventoryStatus: migrating ====================
-- create_enum("eh_released_inventory_status", ["rejected", "pending", "allocated", "released", "transferred"])
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
no implicit conversion of Symbol into Integer/app/vendor/bundle/ruby/2.0.0/gems/power_enum-2.8.0/lib/power_enum/schema/schema_statements.rb:84:in `[]'
/app/vendor/bundle/ruby/2.0.0/gems/power_enum-2.8.0/lib/power_enum/schema/schema_statements.rb:84:in `create_enum'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:662:in `block in method_missing'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in `block in say_with_time'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in `say_with_time'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:652:in `method_missing'
/app/db/migrate/20141119113015_create_released_inventory_status.rb:3:in `change'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:606:in `exec_migration'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:590:in `block (2 levels) in migrate'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:589:in `block in migrate'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection
迁移文件:
class CreateReleasedInventoryStatus < ActiveRecord::Migration
def change
create_enum("eh_released_inventory_status", ["rejected", "pending", "allocated", "released", "transferred"])
end
end
我也在使用以下 gem:
gem 'power_enum'
对于您正在使用的 power_enum
gem,您的迁移语法似乎不正确。
gem 的 README 表示语法使用名称,然后是选项散列,例如:
create_enum("status", {…})
而您使用的是名称,然后是数组:
create_enum("eh_released_inventory_status", […])
据我所知,解决方案是将您发布的迁移行更改为 power_enum
语法。 README 有很多示例,看起来也很详尽并且有很好的文档记录。
我认为你的迁移应该是这样的
class CreateReleasedInventoryStatus < ActiveRecord::Migration
def change
create_enum :released_inventory_status, name_column: :status, description: true, name_limit: 5
["rejected", "pending", "allocated", "released", "transferred"].each do |status|
ReleasedInventoryStatus.update_enumerations_model do |klass|
#0.8.1 < version < 0.9.3 does not yield the klass
#in this case use:
#ReleasedInventoryStatus.create
#in place of klass.create
klass.create :name => status,
:description => status.capitalize
end
end
end
end
这将创建具有 status
和 description
列的 table released_inventory_statuses
,最多 5 个唯一状态。然后它将通过 update_enumeration_model
为您列表中的每个项目填充 status
和 description
。这应该适用于您的用例,但我没有测试过这个理论。我的回答完全基于 create_enum
的工作原理,然后是 README
的这一部分
update_enumerations_model (since version 0.8.1)
The preferred mechanism to update an enumerations model in migrations and similar. Pass in a block to this method to to perform any updates.
所以我正在开发一个现有的应用程序,出于某种原因我能够让它工作并在我的本地环境中进行镜像但是当我尝试在 heroku 上迁移时我收到以下错误,有什么想法吗?
错误:
== 20141119113015 CreateReleasedInventoryStatus: migrating ====================
-- create_enum("eh_released_inventory_status", ["rejected", "pending", "allocated", "released", "transferred"])
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
no implicit conversion of Symbol into Integer/app/vendor/bundle/ruby/2.0.0/gems/power_enum-2.8.0/lib/power_enum/schema/schema_statements.rb:84:in `[]'
/app/vendor/bundle/ruby/2.0.0/gems/power_enum-2.8.0/lib/power_enum/schema/schema_statements.rb:84:in `create_enum'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:662:in `block in method_missing'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in `block in say_with_time'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:632:in `say_with_time'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:652:in `method_missing'
/app/db/migrate/20141119113015_create_released_inventory_status.rb:3:in `change'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:606:in `exec_migration'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:590:in `block (2 levels) in migrate'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/migration.rb:589:in `block in migrate'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection
迁移文件:
class CreateReleasedInventoryStatus < ActiveRecord::Migration
def change
create_enum("eh_released_inventory_status", ["rejected", "pending", "allocated", "released", "transferred"])
end
end
我也在使用以下 gem:
gem 'power_enum'
对于您正在使用的 power_enum
gem,您的迁移语法似乎不正确。
gem 的 README 表示语法使用名称,然后是选项散列,例如:
create_enum("status", {…})
而您使用的是名称,然后是数组:
create_enum("eh_released_inventory_status", […])
据我所知,解决方案是将您发布的迁移行更改为 power_enum
语法。 README 有很多示例,看起来也很详尽并且有很好的文档记录。
我认为你的迁移应该是这样的
class CreateReleasedInventoryStatus < ActiveRecord::Migration
def change
create_enum :released_inventory_status, name_column: :status, description: true, name_limit: 5
["rejected", "pending", "allocated", "released", "transferred"].each do |status|
ReleasedInventoryStatus.update_enumerations_model do |klass|
#0.8.1 < version < 0.9.3 does not yield the klass
#in this case use:
#ReleasedInventoryStatus.create
#in place of klass.create
klass.create :name => status,
:description => status.capitalize
end
end
end
end
这将创建具有 status
和 description
列的 table released_inventory_statuses
,最多 5 个唯一状态。然后它将通过 update_enumeration_model
为您列表中的每个项目填充 status
和 description
。这应该适用于您的用例,但我没有测试过这个理论。我的回答完全基于 create_enum
的工作原理,然后是 README
update_enumerations_model (since version 0.8.1)
The preferred mechanism to update an enumerations model in migrations and similar. Pass in a block to this method to to perform any updates.