2011-09-27 51 views
3

这是本帖子Rails, data structure and performance的后续内容,我尝试在Rails上创建计数器缓存。为了不让它默认为0,我还添加了将列更新到数据库中现有的计数值。在heroku上运行迁移时出现问题

运行rake db:迁移开发工作正常,即使花了几个小时运行。

但使用了Heroku的迁移是给我下面的错误:

== AddVotesCount: migrating ================================================== 
-- add_column(:options, :votes_count, :integer, {:default=>0}) 
    -> 0.0196s 
/Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `initialize': Operation timed out - connect(2) (Errno::ETIMEDOUT) 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `open' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `block in connect' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:44:in `timeout' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:87:in `timeout' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `connect' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:637:in `do_start' 
    from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:626:in `start' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/resource.rb:51:in `get' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:554:in `process' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:532:in `get' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:290:in `read' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:311:in `each' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/command/run.rb:50:in `rake' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/command.rb:114:in `run' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/bin/heroku:14:in `<top (required)>' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/bin/heroku:19:in `load' 
    from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/bin/heroku:19:in `<main>' 

我已经尝试了一些不同的事情,但在这一点上似乎失去了,任何帮助表示赞赏!奇怪的是,错误消息并不总是立即出现,有时需要10/20分钟,就好像迁移正在运行一样。

感谢

更新:这里是我的移民文件的内容:

class AddVotesCount < ActiveRecord::Migration 
    def self.up 
    add_column :options, :votes_count, :integer, :default => 0 
    Option.all.each do |option| 
     option.votes_count = option.votes.count 
     option.save! 
    end 
    end 

    def self.down 
    remove_column :options, :votes_count 
    end 
end 

更新2:该作品在临时环境与Heroku的......但不是在生产

后很少修改,迁移代码现在是:

def self.up 
    add_column :options, :votes_count, :integer, :default => 0 
    Option.reset_column_information 
    Option.find_each do |option| 
     Option.reset_counters option.id, :votes 
    end 

and er ROR是:

== AddVotesCount: migrating ================================================== 
-- add_column(:options, :votes_count, :integer, {:default=>0}) 
-> 0.0224s 
/Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `initialize': getaddrinfo: nodename nor servname provided, or not known (SocketError) 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `open' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `block in connect' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:44:in `timeout' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/timeout.rb:87:in `timeout' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:644:in `connect' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:637:in `do_start' 
     from /Users/ebellity/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:626:in `start' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/rest-client-1.6.7/lib/restclient/resource.rb:51:in `get' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:554:in `process' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:532:in `get' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:290:in `read' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/client.rb:311:in `each' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/command/run.rb:50:in `rake' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/lib/heroku/command.rb:114:in `run' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/gems/heroku-2.8.4/bin/heroku:14:in `<top (required)>' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/bin/heroku:19:in `load' 
     from /Users/ebellity/.rvm/gems/ruby-1.9.2-p136/bin/heroku:19:in `<main>' 
+0

你的迁移文件的内容是什么? – Dogbert

+0

@Dogbert只编辑了这个问题,添加了迁移文件 – Emmanuel

+0

Completey的帮助,但是你真的需要这种迁移吗?你能不能在Option模型中创建一个名为votes_count的方法,该方法返回votes.count? – Yule

回答

2

对于那些谁可能面临同样的错误,我在Heroku上取得了联系,他们告诉我要运行这个迁移:

$ heroku run bash --app appname 

然后

$ rake db:migrate 

由于某种原因,它工作...

+0

对于'$ heroku run bash'为+1。我不知道你可以在你的本地终端上运行bash。 –

相关问题