所以我有一个相当不寻常的问题。我创建一个实例变量并为其分配一个哈希。然后我更新该哈希并且我在更新后检查旧哈希是否等于新哈希。但每次,旧对象都是如何更新并等同于更新的记录。我这样做是因为我需要检查哈希是否已更新。这是代码段
编辑: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
答案 0 :(得分:0)
如前所述或暗含的,您的问题是,当您将@mlo.steps[params[:step_id]]["assessment_rules"]
分配给2个变量时,您将给它们分配 reference 到同一哈希中;因此使用2个变量中的1个进行的更改将应用于其他变量。
假设mlo
中没有复杂的对象(例如,除了哈希,数组,字符串,数字等),这是确定差异并直观查看的简单明了方式 em>,是调用@mlo.to_yaml
(或JSON.pretty_generate(@mlo)
)来创建数据前后的多行人类可读表达式,并进行比较。
有些工具(例如Diffy)可以以可读的方式显示差异。