2016-10-29 3 views
0

XMLファイルをソースとして使用してデータベースをシードするカテゴリモデルがあります。XMLソースファイルに基づいてモデルを再帰的に挿入する

私のXMLは次のようになります。

<categories> 
    <category name="Bikes"> 
    <category name="Helmets"></category> 
    <category name="Gloves"></category> 
    </category> 
</categories> 

マイカテゴリーモデルは次のようになります。

Category 
    parent_id 
    name 

どのようにループXMLを通って、新しいカテゴリを挿入することができますか?それは本質的に再帰的でなければならないので、各カテゴリに正しいparent_idを関連付けることもできます。

category = Category.new(
    parent_id: -1 
    name: "") 
+0

このアルゴリズム上の問題のためのルビーソリューションを探していますか、これをルビーオンレールアプリケーションにどのように適合させるかを尋ねていますか? – infiniteRefactor

+0

@infiniteRefactor私はそれについて考えて、categories.xmlファイルを使ってrakeタスクとして作成しています。私はルビー部分(xml + recursion)の助けが必要です – Blankman

答えて

2

ここは私の2セントです。まず、XMLファイルを解析する必要があります。あなたは、REXMLや他のXMLパーサーを使ってルビーを作ることができます。

require "rexml/document" 
file = File.new("mydoc.xml") 
doc = REXML::Document.new file 

その後、あなたはトップレベルのカテゴリ最初

doc.elements.each("categories/category") { |element| 
    addCategoryTree(element, nil) 
} 

addCategoryTree以上のループはトップレベルのカテゴリを作成し、再帰的にそれぞれの子のために自分自身を呼び出す再帰的な方法になりますことができます。

def addCategoryTree(elementXml, parentObj) 
    if parentObj.nil? 
    categoryObj = createCategory(elementXml.attributes["name"], nil) 
    else 
    categoryObj = createCategory(elementXml.attributes["name"], parentObj) 
    end 
    elementXML.each("category") { |childXml| 
    addCategoryTree(childXml, categoryObj) 
    } 
end 

createCategoryでは、実際のカテゴリオブジェクトを作成できます。 createCategoryの最初のパラメータはカテゴリのXML DOMオブジェクトで、2番目のパラメータは作成した親オブジェクトです。私はそれらがオブジェクトを作成するのに十分だと思います。

関連する問題