在Heroku上运行Ruby脚本的“未知属性”

时间:2012-11-26 05:20:41

标签: ruby activerecord heroku migration runtime-error

我有一个一次性脚本,我用它来将一些数据加载到我的应用程序的数据库中。

这有点大,所以我在这里说:https://gist.github.com/097fb5a30ce84522077a

当针对DATABASE_URL环境变量指定的本地计算机(甚至远程实例)上的本地Postgres实例执行时,编写的代码完美无缺地

但是,Heroku绝对不行。执行链接的ruby脚本会给我这个错误:

~ $ ruby importprofiles.rb
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/attribute_assignment.rb:88:in `block in assign_attributes': unknown attribute: owner_id
(ActiveRecord::UnknownAttributeError)

我的工作流程基本上是:

  • 在Heroku上创建应用程序(heroku create mybot
  • 推送代码(git commit -m 'initial commit' && git push heroku master
  • 设置数据库(heroku run rake db:setup
  • 重新启动实例(heroku restart
  • 在heroku实例(heroku run bash
  • 上调用Bash shell
  • 使用Curl从服务器(curl http://blah.com/profiles.ini > profiles.ini
  • 下拉生产profiles.ini
  • 运行脚本(ruby importprofiles.rb

为什么我在Heroku上获取本地有效代码的未知属性错误?

1 个答案:

答案 0 :(得分:2)

您的schema.rb与您的真实数据库不匹配,或者您从未尝试过使用Profile所有者。你在schema.rb

中有这个
create_table "profiles", :force => true do |t|
  t.string   "title",   :limit => 100
  t.integer  "owner"
  t.datetime "timeset"
  t.string   "whoset"
end

t.integer "owner"owner表格中定义了一个名为profiles的列,但您需要owner_id列。

也许你做了一个手册alter table来重命名开发环境中的列。或者这可能是您第一次使用此代码路径。

在任何情况下,您都需要迁移才能将profiles.owner重命名为profiles.owner_id。或者,由于您刚开始使用,您可以手动编辑schema.rb以重命名该列并重建您的Heroku数据库。我只需手动修补schema.rb,如果您没有任何数据需要担心,请重新开始。