我有以下代码片段从db中获取某些列:
@data = Topic.select("id,name").where("id in (?)",@question.question_topic.split(",")).map(&:attributes)
在生成的哈希数组中,它是:
当前:
@data = [ { "id" => 2, "name" => "Sports" }]
要改为:
@data = [ { "id" => "2", "name" => "Sports" }]
我想从string
将“id”转换为fixnum
。 Id在db中是整数。最干净的方法是什么?
注意:使用.map(&:attributes)
后,它不是活动记录关系。
您可以使用正确的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
您正在寻找的只是简单的
@data.each { |obj| obj["id"] = obj["id"].to_s }
实际上没有一种更简单的方法(我认为无论如何都很简单)。
通过标题来表示一个不同的问题 - 将哈希值中的每个值转换为字符串,您可以执行此操作:
@data.each do |obj|
obj.map do |k, v|
{k => v.to_s}
end
end
无论如何只要离开那里。
你可以在这里使用Ruby's #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
这将迭代哈希中的所有键名,并将该值替换为与键关联的基准的#to_s版本。 nil被转换为空字符串。此外,这假设您在散列中没有复杂数据,如嵌入式数组或其他散列。
def hash_values_to_string(hash)
hash.keys.each {|k| hash[k]=hash[k].to_s}; hash
end