2016-10-06 34 views
0

我創建哈希的陣列結構和我創建了Postgres的一列,以節省使用遷移該結構如下如何保持陣列結構保存記錄時 - 的ActiveRecord/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,to:varchar並得到相同的結果。我發現的唯一解決方案是使用eval命令將字符串轉換回數組,這並不理想。

回答

1

你需要列類型設置爲json.Use以下遷移命令 -

rails g migration AddKeyDirectionsToCalendarEvent key_directions:json 

轉換您的結構與紅寶石陣列像這樣:

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}]}] 
+0

只是嘗試這樣做,並給了我這個 'PG :: InvalidTextRepresentation:錯誤:無效的輸入語法類型json的詳細信息:預期「:」,但找到「,」。 CONTEXT:JSON數據,第1行:...:travel_mode => \「WALKING \」,::travel_type => nil}]},...:UPDATE「calendar_events」SET「key_directions」= $ 1,「updated_at」= $ 2 WHERE「calendar_events」。「id」= $ 3' –

+0

如果你已經在這個專欄的數據庫中有一些記錄,你必須先刪除它們。 – dnsh

+0

我不......我的結構就是你給出的例子。 –