I discovered the issue. The problem was a difference in SQLite/ PostgreSQL connector behavior. The SQLite connector seems to allow field access by index, but the PostreSQL connector returned nil values when I tried to access the field by index. When I changed "grid[0]" to "grid['id']", etc, the issue went away. The red herring was the error message produced when YAML complained about getting a nil object passed into YAML::load.
Thanks folks! --Justin On Jul 28, 4:35 pm, Justin <[email protected]> wrote: > Hi folks! Can someone help me find the problem with my migration, > below? It's working fine on my local environment, but when I run it > in Heroku I get 'an instance of IO needed' error. I shouldn't need an > IO instance since I'm passing a string to the method--or at least > that's the intent. The intent of the code is to read from the > database a serialized instance of a Grid, deserialize the object, > create a StaggeredGrid based on the contents, then serialize the new > object. I can't do this directly at the ActiveRecord level because > the active record object that owns the grid is expecting a > StaggeredGrid and fails validation. > > Any ideas? Thanks in advance! > > === migration file: > > # This seems to be required for YAML::load since the Grid class is > never > # directly invoked > require 'lib/grid' > require 'lib/staggered_grid' > > class GridToStaggeredGrid < ActiveRecord::Migration > def self.up > say_with_time "Changing existing grids to staggered grids..." do > suppress_messages do > grids = execute "SELECT id, grid FROM grids" > grids.each do |grid| > old_grid = YAML::load(grid[1]) > new_grid = StaggeredGrid.new old_grid.row_count, > old_grid.column_count > old_grid.each_with_coordinates do | cell, row, column | > new_grid[row][column] = cell > end > result = execute "UPDATE challenges SET grid = > '#{YAML::dump(new_grid)}' WHERE id = #{grid[0]}" > end > end > end > end > > def self.down > say_with_time "Changing existing staggered grids back to grids..." > do > suppress_messages do > grids = execute "SELECT id, grid FROM grids" > grids.each do |grid| > old_grid = YAML::load grid[1] > new_grid = Grid.new old_grid.row_count, > old_grid.column_count > old_grid.each_with_coordinates do | cell, row, column | > new_grid[row][column] = cell > end > result = execute "UPDATE challenges SET grid = > '#{YAML::dump(new_grid)}' WHERE id = #{grid[0]}" > end > end > end > end > end -- You received this message because you are subscribed to the Google Groups "Heroku" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/heroku?hl=en.
