[英]How to keep array structure when saving record - activerecord/postgres
我创建了一个哈希数组结构,并在postgres中创建了一个列,以使用下面的迁移保存该结构
class AddKeyDirectionsToEvent < ActiveRecord::Migration[5.0]
def change
add_column :calendar_events, :key_directions, :text, array:true, default: []
end
end
现在,数组的结构如下
{
:in => [
[0] {
:duration => "5 mins",
:distance => "0.4 km",
:travel_mode => "WALKING",
:travel_type => nil
},
[1] {
:duration => "12 mins",
:distance => "5.3 km",
:travel_mode => "TRANSIT",
:travel_type => "SUBWAY"
},
[2] {
:duration => "9 mins",
:distance => "0.7 km",
:travel_mode => "WALKING",
:travel_type => nil
}
]
}
{
:out => [
[0] {
:duration => "10 mins",
:distance => "0.7 km",
:travel_mode => "WALKING",
:travel_type => nil
},
[1] {
:duration => "12 mins",
:distance => "5.3 km",
:travel_mode => "TRANSIT",
:travel_type => "SUBWAY"
},
[2] {
:duration => "6 mins",
:distance => "0.4 km",
:travel_mode => "WALKING",
:travel_type => nil
}
]
}
但是由于某种原因,它像这样保存在数据库中
["{:in=>[{:duration=>\"5 mins\", :distance=>\"0.4 km\", :travel_mode=>\"WALKING\", :travel_type=>nil}, {:duration=>\"12 mins\", :distance=>\"5.3 km\", :travel_mode=>\"TRANSIT\", :travel_type=>\"SUBWAY\"}, {:duration=>\"9 mins\", :distance=>\"0.7 km\", :travel_mode=>\"WALKING\", :travel_type=>nil}]}", "{:out=>[{:duration=>\"10 mins\", :distance=>\"0.7 km\", :travel_mode=>\"WALKING\", :travel_type=>nil}, {:duration=>\"12 mins\", :distance=>\"5.3 km\", :travel_mode=>\"TRANSIT\", :travel_type=>\"SUBWAY\"}, {:duration=>\"6 mins\", :distance=>\"0.4 km\", :travel_mode=>\"WALKING\", :travel_type=>nil}]}"]
有什么想法吗? 我尝试改变从:text到:varchar的数组类型,并得到了相同的结果。 我发现的唯一解决方案是使用eval命令将字符串转换回不理想的数组。
您需要将列类型设置为json。使用以下迁移命令-
rails g migration AddKeyDirectionsToCalendarEvent key_directions:json
将您的结构转换为ruby数组,如下所示:
data = [{
:in => [
{
:duration => "5 mins",
:distance => "0.4 km",
:travel_mode => "WALKING",
:travel_type => nil
},
{
:duration => "12 mins",
:distance => "5.3 km",
:travel_mode => "TRANSIT",
:travel_type => "SUBWAY"
},
{
:duration => "9 mins",
:distance => "0.7 km",
:travel_mode => "WALKING",
:travel_type => nil
}
]
},
{
:out => [
{
:duration => "10 mins",
:distance => "0.7 km",
:travel_mode => "WALKING",
:travel_type => nil
},
{
:duration => "12 mins",
:distance => "5.3 km",
:travel_mode => "TRANSIT",
:travel_type => "SUBWAY"
},
{
:duration => "6 mins",
:distance => "0.4 km",
:travel_mode => "WALKING",
:travel_type => nil
}
]
}]
然后做,
event.key_directions=data
event.save
它将像这样保存在数据库中,
[["updated_at", 2016-10-06 13:11:26 UTC], ["key_directions", "[{\"in\":[{\"duration\":\"5 mins\",\"distance\":\"0.4 km\",\"travel_mode\":\"WALKING\",\"travel_type\":null},{\"duration\":\"12 mins\",\"distance\":\"5.3 km\",\"travel_mode\":\"TRANSIT\",\"travel_type\":\"SUBWAY\"},{\"duration\":\"9 mins\",\"distance\":\"0.7 km\",\"travel_mode\":\"WALKING\",\"travel_type\":null}]},{\"out\":[{\"duration\":\"10 mins\",\"distance\":\"0.7 km\",\"travel_mode\":\"WALKING\",\"travel_type\":null},{\"duration\":\"12 mins\",\"distance\":\"5.3 km\",\"travel_mode\":\"TRANSIT\",\"travel_type\":\"SUBWAY\"},{\"duration\":\"6 mins\",\"distance\":\"0.4 km\",\"travel_mode\":\"WALKING\",\"travel_type\":null}]}]"], ["id", 4]]
当您访问它时,您将获得数组
event.key_directions
=> [{"in"=>[{"duration"=>"5 mins", "distance"=>"0.4 km", "travel_mode"=>"WALKING", "travel_type"=>nil}, {"duration"=>"12 mins", "distance"=>"5.3 km", "travel_mode"=>"TRANSIT", "travel_type"=>"SUBWAY"}, {"duration"=>"9 mins", "distance"=>"0.7 km", "travel_mode"=>"WALKING", "travel_type"=>nil}]}, {"out"=>[{"duration"=>"10 mins", "distance"=>"0.7 km", "travel_mode"=>"WALKING", "travel_type"=>nil}, {"duration"=>"12 mins", "distance"=>"5.3 km", "travel_mode"=>"TRANSIT", "travel_type"=>"SUBWAY"}, {"duration"=>"6 mins", "distance"=>"0.4 km", "travel_mode"=>"WALKING", "travel_type"=>nil}]}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.