Почему я не могу установить значение этого хеш-ключа? - PullRequest
0 голосов
/ 16 мая 2011
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=>"blabla"
        }
   }

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)>'

Код в https://github.com/Nerian/DPovray

Неудачный тест можно запустить с rspec spec/task_spec.rb

1 Ответ

1 голос
/ 17 мая 2011

На самом деле project = redis.hget('active_projects', task[:project]) возвращает строку, а не хэш рубина.Вот почему это не получается.

Я играю с https://github.com/nateware/redis-objects, чтобы посмотреть, смогу ли я сделать то, что хочу.

Кроме того, вместо выполнения:

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

Вы можете сделать:

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

И это просто работает, благодаря маршалированию хеша.

Тем не менее, я не считаю это хорошим решением.Я не люблю использовать Marshaling, так как отладку очень сложно смотреть на базу данных.

Также я только что получил:

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

Итак, давайте откроем другой подход ...

edit:

Теперь я играю сJSON.dump и JSON.parse.Они кажутся лучшим подходом.

Редактировать:

В итоге я инкапсулировал этот хэш в реальный объект.Итак, у меня есть класс Project и класс Task.В каждом из них я определяю методы to_json и self.json_create(o), чтобы их можно было преобразовывать в JSON и обратно.

Он работает довольно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...