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.

Reply via email to