实例对象正在被自动覆盖

时间:2018-06-18 12:37:26

标签: ruby-on-rails ruby object

所以我有一个相当不寻常的问题。我创建一个实例变量并为其分配一个哈希。然后我更新该哈希并且我在更新后检查旧哈希是否等于新哈希。但每次,旧对象都是如何更新并等同于更新的记录。我这样做是因为我需要检查哈希是否已更新。这是代码段

编辑:old_json = @ old_rules.to_json new_json = @ new_rules.to_json并比较这两个似乎正在使用正确的结果。我想这是使用相同的对象

@old_rules = @mlo.steps[params[:step_id]]["assessment_rules"]
puts "old rules"
puts @old_rules 
#{"48771"=>{"level"=>"Easy", questions"=>"881"}}
@mlo.steps[params[:step_id]]["assessment_rules"].each do |key,value|
  if (rules_data["poolname"] == value["poolname"] && rules_data["resourcetype"] == value["resourcetype"] && rules_data["level"] == value["level"])
    updated_no_of_questions = value["questions"].to_i + rules_data["questions"].to_i 
    value["questions"] = updated_no_of_questions.to_s
    @mlo.save
  end
end

@new_rules = @mlo.steps[params[:step_id]]["assessment_rules"]
puts "updated rules"
puts "new rules"
#{"48771"=>{"level"=>"Easy", questions"=>"885"}}
if (@old_rules == @new_rules)
  #but this condition satisfies as after the update, @old_rules got updated somehow!
  #@old_rules is now #{"48771"=>{"level"=>"Easy", questions"=>"885"}}
  puts "equal"
  @mlo.steps[params[:step_id]]["assessment_rules"].merge!(hash_id.to_s => rules_data)
  @mlo.save
end

1 个答案:

答案 0 :(得分:0)

如前所述或暗含的,您的问题是,当您将@mlo.steps[params[:step_id]]["assessment_rules"]分配给2个变量时,您将给它们分配 reference 到同一哈希中;因此使用2个变量中的1个进行的更改将应用​​于其他变量。

假设mlo中没有复杂的对象(例如,除了哈希,数组,字符串,数字等),这是确定差异并直观查看的简单明了方式 em>,是调用@mlo.to_yaml(或JSON.pretty_generate(@mlo))来创建数据前后的多行人类可读表达式,并进行比较。

有些工具(例如Diffy)可以以可读的方式显示差异。