开发者

Why I cannot set the value of this hash key?

开发者 https://www.devze.com 2023-03-06 13:18 出处:网络
task = {:project=>1000, :order=>0, :partial_image=>nil, :options=>{ :height=>50, :width=>50,
task = {:project=>1000, 
        :order=>0, 
        :partial_image=>nil, 
        :options=>{
           :height=>50, 
           :width=>50, 
           :start_row=>1, 
           :start_column=>1, 
           :end_row=>50, 
           :end_column=>50, 
           :scene=>0}}

project = redis.hget('active_projects', task[:project])        
=> 
{:name=>"Pov", 
 :tasks=>
        {0=>
            {:project=>1000, 
             :order=>0, 
             :partial_image=>nil, 
             :options=>
                 {:height=>50, 
                  :width=>50, 
                  :start_row=>1, 
                  :start_column=>1, 
                  :end_row=>50, 
                  :end_column=>50, 
                  :scene=>"blabla"
                 }
             }
         }, 
  :id=>1000,
  :image=>"", 
  :options=>
        {:height=>100, 
         :width=>50,  
         :scene=>"blabl开发者_运维技巧a"
        }
   }

task[:partial_image] = 'blablabla'    
project[:tasks][task[:order]] = task    # this is line 37

 Failure/Error: completed_task = DPovray::Task.perform(task)
 TypeError:
   can't convert Symbol into Integer
 # ./lib/jobs/job.rb:37:in `[]'
 # ./lib/jobs/job.rb:37:in `block in perform'
 # ./lib/jobs/job.rb:35:in `perform'
 # ./spec/task_spec.rb:22:in `block (4 levels) in <top (required)>'

The code is in https://github.com/Nerian/DPovray

The test that fails can be run with rspec spec/task_spec.rb


Actually project = redis.hget('active_projects', task[:project]) is returning a string, not a ruby hash. So that is why it fails.

I am playing with https://github.com/nateware/redis-objects to see if I can do what I want to do.

Also, instead of doing:

Redis.new.hset('active_projects', active_project[:id], active_project)

You can do:

Redis.new.hset('active_projects', active_project[:id], Marshal.dump(active_project))

And it just works, thanks to hash marshaling.

Nonetheless, I do not consider this a good solution. I don't like to use Marshaling as it is much difficult do debug by looking at the database.

Also I just got a:

 incompatible marshal file format (can't be read)
    format version 4.8 required; 123.58 given

So let us discover a different approach...

edit:

Now I am playing with JSON.dump and JSON.parse. They seem a better approach.

Edit:

I ended up encapsulating this hash into a real object. So I have Project class and a Task class. In each one I define the methods to_json and self.json_create(o) to that they can be convert to and from JSON.

It works quite well.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号