【问题标题】:no implicit conversion of Symbol into Integer when migrating in production在生产中迁移时没有将 Symbol 隐式转换为 Integer
【发布时间】:2015-03-17 20:49:47
【问题描述】:

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

【问题讨论】:

  • 你看过方法签名和文档吗? Here is the source。它正在寻找table_name,然后是Hash 而不是Array,这是你的问题。源调用[] 并带有一个符号以提取选项,但您传递了一个Array,其中[] 想要一个Integer
  • def change create_enum("eh_released_inventory_status" => ["rejected", "pending", "allocated", "released", "transferred"]) 结束
  • 这不是它正在创建的列,它是一个表。这些未列出的选项在其中传递,例如create_enum :released_inventory, :name_column =&gt; :status 实际上会创建一个名为released_inventories 的表,其中有一列名为status
  • 感谢engineermnsky!这就是为什么我对如何将其转换为哈希感到困惑的原因。请指教!干杯!!
  • 我想我找到了解决您问题的方法,但我还没有测试过。请参阅下面的答案。

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


【解决方案1】:

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

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

create_enum("status", {…})

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

create_enum("eh_released_inventory_status", […])

据我所知,解决方案是将迁移行从您发布的内容更改为 power_enum 语法。 README 有很多示例,而且看起来很详尽,文档也很完善。

【讨论】:

  • 明白了,有道理!您能否提供一个示例,因为我想通过哈希保留类似的功能。那我就接受你的回答。
  • 我给了你一个+1,因为你说的在理论上是正确的,但是,在这种情况下,因为它是一个现有的应用程序,我宁愿让它按原样工作,而不是改变它..必须有办法让它按原样工作,因为它在开发环境中工作得很好。
  • 感谢您的 +1。我已经在一个干净的开发环境中测试了你的代码,并且代码在那里也有相同的语法错误。也许您的开发环境正在使用不同的数据库或 gem 版本,或者正在缓存,或者没有重新加载表等?
【解决方案2】:

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

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_statuses,其中包含statusdescription 列,唯一状态限制为5 个。然后它将为您通过update_enumeration_model 列出的每个项目填充statusdescription。这应该适用于您的用例,但我没有测试过这个理论。我的回答完全基于create_enum 的工作原理以及自述文件的这一部分

update_enumerations_model(从 0.8.1 版开始)

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

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多