2015-10-19 61 views
1

我用引入nokogiri解析一個XML文檔轉換成散列的數組:如何將散列數組保存到數據庫?

傭工/ countries.helper

module CountriesHelper 

    def parse 
    @countries = ['australia', 'canada', 'france'] 
    @countries.inject([]) do |memo, country| 
    File.open("public/#{country}.xml") do |f| 
    xml = Nokogiri::XML(f) 
    path = "//country/stores/" 
     memo << xml.xpath(path).map do |x| 
      { 'country' => x.parent['country'], 
      'store' => x['store']} 
    end 
    end 
    end 

# [{"country"=>"australia", "store"=>"store1"}, {"country"=>"france", "store"=>"store2"}] 

我怎樣才能挽救這個數組哈希格式的到我的數據庫?比方說,我有兩個模型國家和商店。

回答

0

您可以將散列數組存儲在數據庫的text字段中。

像這樣的事情在你的移民文件:

create_table "your_table", force: true do |t| 
    t.text "your_column_name" 
end 

或者,如果你已經在數據庫中的表,只是希望將新列添加到表:

class Migration0001 
    def change 
    add_column :your_table, :your_column_name, :text 
    end 
end 

剛所以你知道,如果你想在數據庫中保存一個Hash對象,並且如果你將列類型定義爲:text,那麼Rails應該能夠正確地序列化它,並且你不需要在你的模型中明確地使用serialize

但是,在你的情況下,它的HashArray,所以它是一個Array對象需要保存在數據庫中,所以你需要序列化領域的模型:

serialize :your_column_name, Array 

這樣,您可以在數據庫中保存ArrayHashes。希望這可以幫助。

0

假設國家有很多商店。將散列存儲在數據庫中將會變得毫無意義(在我看來)。存儲在單獨的表格中會使查詢變得更有意義和容易。

module CountriesHelper 

    def parse 
    @countries = ['australia', 'canada', 'france'] 
    @countries.inject([]) do |memo, country| 
    File.open("public/#{country}.xml") do |f| 
    xml = Nokogiri::XML(f) 
    path = "//country/stores/" 
     memo << xml.xpath(path).map do |x| 
      { 'country' => x.parent['country'], 
      'store' => x['store']} 

     country = Country.find_by_name(x.parent['country']) 
     if country.nil? 
     country = Country.create(name: x.parent['country']) 
     end 
     country.stores.create(name: x['store']) 
    end 
    end 
    end 

數據庫事務旨在從模型中調用;你可以稍後重構。

class Country < ActiveRecord::Base 
    has_many :stores 
end 


class Store < ActiveRecord::Base 
    belongs_to :country 
end 
2

您可以serialize屬性,這意味着將其保存爲特定類型的對象。

#in your model 
serialize :store_hashes, Array 

該字段應該是數據庫中的text字段。我不知道在這個特殊情況下這是否是一個好主意 - 我懷疑它不是。但這就是如何將一列哈希存儲到數據庫的方式。

http://apidock.com/rails/ActiveRecord/Base/serialize/class