在生产中迁移时,不会将符号隐式转换为整数

时间:2015-03-17 20:49:47

标签: ruby-on-rails ruby-on-rails-4 heroku

所以我正在处理一个现有的应用程序,出于某些原因,我能够让它在我的本地环境中工作和镜像,但是当我尝试在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'

2 个答案:

答案 0 :(得分:1)

您正在使用的power_enum gem的迁移语法似乎不正确。

gem README表示语法使用名称,然后使用选项哈希,例如:

create_enum("status", {…})

您使用的是名称,然后是数组:

create_enum("eh_released_inventory_status", […])

据我所知,解决方案是将您的迁移线从您发布的power_enum语法更改。自述文件有很多例子,看起来也很全面且记录完备。

答案 1 :(得分:0)

我认为你的迁移应该是这样的

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

这将创建包含released_inventory_statusesstatus列的表description,其中包含5个唯一身份限制。然后,它会通过status为您列表中的每个项目填充descriptionupdate_enumeration_model。这应该适用于您的用例,但我没有测试过这个理论。我的回答纯粹基于create_enum的工作原理,然后是README的这一部分

  

update_enumerations_model(自版本0.8.1起)

     

在迁移和类似过程中更新枚举模型的首选机制。将块传递给此方法以执行任何更新。