Ruby将散列中的所有值转换为字符串

vjrehmav  于 2023-04-29  发布在  Ruby
关注(0)|答案(5)|浏览(200)

我有以下代码片段来从数据库中获取某些列:

@data =  Topic.select("id,name").where("id in (?)",@question.question_topic.split(",")).map(&:attributes)

在得到的哈希数组中,它是:

当前:

@data =    [ { "id" => 2, "name" => "Sports" }]

改为:

@data =    [ { "id" => "2", "name" => "Sports" }]

我想将“id”从fixnum转换为string.Id在数据库中为整数。最干净的方法是什么?
注意:使用.map(&:attributes)后,它不是活动记录关系。

8wtpewkr

8wtpewkr1#

你可以使用map来实现:

topics = Topic.select("id,name").where("id in (?)",@question.question_topic.split(","))
@data = topics.map do |topic|
  {
    'id' => topic.id.to_s,
    'name' => topic.name
  }
end
ctehm74n

ctehm74n2#

你要找的只是

@data.each { |obj| obj["id"] = obj["id"].to_s }

没有更简单的方法了(我认为这已经足够简单了)。
通过标题,这意味着一个不同的问题-将哈希中的每个值转换为字符串,你可以这样做:

@data.each do |obj| 
  obj.map do |k, v|        
      {k => v.to_s} 
  end
end

反正就放在那儿了。

jutyujz0

jutyujz03#

你可以在这里使用Ruby的#inject:

@data.map do |datum|
  new_datum = datum.inject({}) do |converted_datum, (key, value)|
    converted_datum[key] = value.to_s

    converted_datum
  end
end

这会将所有值转换为字符串,而不管键是什么。
如果你使用的是Rails,使用Rails' #each_with_object会更简洁:

@data.map do |datum|
  datum.each_with_object({}) do |(key, value), converted_datum|
    converted_datum[key] = value.to_s
  end
end
ozxc1zmp

ozxc1zmp4#

@data.each {|data_item| data_item.transform_values!(&:to_s)}
wd2eg0qa

wd2eg0qa5#

这将迭代散列中的所有键名称,并将值替换为与键相关的数据的#to_s版本。nil被转换为空字符串。此外,这假设您在哈希中没有复杂的数据,如嵌入式数组或其他哈希。

def hash_values_to_string(hash)
  hash.keys.each {|k| hash[k]=hash[k].to_s}; hash
end

相关问题