在rails上使用update_all方法ruby的规范

时间:2016-08-30 10:14:47

标签: ruby-on-rails ruby rspec

我试图编写一个测试我在任务中使用它的函数的规范,这个函数应该重命名一个json密钥并保留该密钥的旧值。

无论如何我无法通过。

我的职能:

module Database
  module JSONHelpers
    def change_json_nested_key(klass, base_field, nested_key, from_key, to_key)
      klass.where("#{base_field}->>'#{nested_key}' LIKE '%#{from_key}%'")
           .update_all(
             "#{base_field} = jsonb_set(\
             #{base_field}::jsonb,\
               array['#{nested_key}'],\
               (#{base_field}->'#{nested_key}')::jsonb - '#{from_key}' ||\
               jsonb_build_object('#{to_key}', #{base_field}->'#{nested_key}'->'#{from_key}'))"
           )
    end
  end
end

我的规格是:

  let(:old_key) { 'drawings' }
  let(:new_key) { 'picture' }
  let(:boxes) { {"#{old_key}" => '4'} }
  let(:move) { Move.create!(boxes: boxes)}

  let(:klass) { Class.new { extend(Database::JSONHelpers) } }
  subject { klass }

  describe '::change_nested_json_key' do
    before(:each) { subject.change_json_nested_key(Move, 'data', 'boxes', old_key, new_key) }

该功能在规范之外工作,但在规范中没有。 binding.pry表示该值未发生变化。

知道什么是错的,或者这里的规则是什么?

1 个答案:

答案 0 :(得分:2)

在更改值

后使用(重新加载)更新您的实例