ruby-on-rails 替换rails中的散列值

6l7fqoea  于 2023-03-04  发布在  Ruby
关注(0)|答案(2)|浏览(228)

我有一个这样的散列:

a = {"note_id"=>[nil, 1], "comment_id"=>[nil, 4]}

 a = {"note_id"=>[1, 3], "comment_id"=>[4, 5]}

 a = {"note_id"=>[3, nil], "comment_id"=>[5, nil]}

我想将note_id的值从[nil,1]更改为[nil,8],或者将[1,3]更改为[8,7],类似地,也可以使用comment_id。
如果值为nil,那么我不想更新那个地方的任何东西。
为此,我是这样做的:

if a.include? 'note_id' || 'comment_id'
   a[:note_id].each do |k| 
      k = object.method1 
   end
   a[:comment_id].each do |k| 
      k = object.method2
   end
end

但是note_id和comment_id值保持不变。
有人能帮我一下吗。

yh2wf1be

yh2wf1be1#

有两件事出了问题:
1.在Hash中有字符串键,以后在a[:note_id]中将它们作为符号引用。

  1. if a.include? 'note_id' || 'comment_id'实际上是if a.include? 'note_id'
    1.当用each枚举Array时,你失去了对数组中位置的引用,你只得到存储在变量k中的元素。因此k=只修改该作用域中的变量。但是,如果您修改a["note_id"]的元素,它会将更改反映到a中,因为通过调用a["note_id"],您将获得对相同的存储在Hash中的Array对象
require "ostruct"
object = OpenStruct.new({method1: 11, method2: 12})
a = {"note_id" => [nil, 1], "comment_id" => [nil, 4]}
#=> {"note_id"=>[nil, 1], "comment_id"=>[nil, 4]}
if (['note_id', 'comment_id'] - a.keys).empty?
   a["note_id"].each_with_index do |v,i|
      a["note_id"][i] = object.method1 unless v.nil?
   end
   a["comment_id"].each_with_index do |v,i| 
      a["comment_id"][i] = object.method2 unless v.nil?
   end
end
a
#=> {"note_id"=>[nil, 11], "comment_id"=>[nil, 12]}

编辑:解决了a.include?条件的问题;已更新代码,使其不更新nil

slsn1g29

slsn1g292#

你可以试试这个:-

if a.include? 'note_id' || 'comment_id'
  a[:note_id] = a[:note_id].map do |k| 
     object.method1 if k!= nil
  end
  a[:comment_id]  = a[:comment_id].map do |k| 
     object.method2 if k!= nil
  end
end

相关问题