2017-01-13 8 views
0

私はオブジェクトのコレクションを持っていて、それぞれが子を持​​っているかもしれないし、子コレクションがないかもしれない子供たちには未知数の世代があります。私はいくつかのオブジェクトの子供たちと子供たちの子供たちをループさせてレンダリングする必要があります

どのようにして各ツリーの最後の子に至るまでレンダリングされるのですか?

人間

[ 
{name: bill, id: 1, human_id: nil}, 
{name: bob, id: 2, human_id: 1}, 
{name: john, id: 3, human_id: 2}, 
{name: marie, id: 4, human_id: 2}, 
{name: jake, id: 6, human_id: 5}, 
{name: anne, id: 5, human_id: nil}, 
] 

ツリー始める(1および5)、彼らは誰にも属していないため、2つのレコードがある見ることができるように。私は

+0

いくつかのサンプルデータを必要な出力で送信してください。 –

答えて

1

があるどのように多くの関係層を知らずに

bill 
    bob 
     john 
     marie 
anne 
    jake 

をレンダリングする必要が

は、あなたがいるかどうかを確認するためにいくつかのif statementsを置くことができ、あなたの.erbファイルに

<% @collection.each do |f| %> 
    <% f.each do |x| %> 
     <%= x.name %> 
     <%= x.id %> 
     <%= x.human_id %> 
    <% end %> 
    <% end %> 

をこのような何かを試してみてください値が存在する

<% @collection.each do |f| %> 
    <% f.each do |x| %> 
     <% if x.name.present? %> 
     <%= x.name %> 
     <% end %> 
     <%= x.id %> 
     <%= x.human_id %> 
    <% end %> 
    <% end %> 
+0

問題は、子供が何人いるか知りません。 ifステートメントの数が変更される可能性があります。 – alpalalpal

0

this approachとすることができます。それは同じ問題だ(上から下にレンダリングする必要性と自己参照モデル。)

ただ、ハッシュなど、個々のレコードを表しメソッドを作成します。 (モデルやそのシリアライザでは、例のように) "子"ハッシュの配列を渡すオプションを提供します。

次に、すべてのレコードをロードするサービスを作成します。&は、構造全体を構築するまで、ハッシュを結果に追加します(毎回子配列を構築する)。あなたのIDをキーとしてハッシュにレコードを格納し、結果に追加されたレコードを削除することができます。

あなたはcerializable使用した場合、あなたのシリアライザはこのようなものになるだろう:

module HumanSerializer 

    def run(human, options) 
    { id: human.id, 
     name: human.name, 
     parent_id: human.parent_id, 
     children: options[:children] || human.children.map(&:cerializable_hash) 
    end 

end 

そして、あなたはツリーを構築するために、このようなサービスを使用することができます。

class AncestryTree 
    def self.call(humans) 
    self.new(humans).tree 
    end 

    def initialize(humans) 
    @humans_hash = {} 
    humans.each { |human| @humans_hash[human.id] = human } 

    @children_resolver = proc do |parent| 
     children_array = [] 

     @humans_hash.each_pair do |id, human| 
     if human.parent_id && human.parent_id == parent.id 
      @humans_hash.delete(id) 
      children_array << human.cerializable_hash(children: @children_resolver.call(human)) 
     end 
     end 

     children_array 
    end 
    end 

    def tree 
    @result = []   

    @humans_hash.each_pair do |id, human| 
     if human.parent_id.nil? 
     @humans_hash.delete(id) 
     @result << human.cerializable_hash(children: @children_resolver.call(human)) 
     end 
    end 

    @result 
    end 
end 

が(ただ、このベースを書きましたREADMEの例に、テストが、あなたのアイデアを取得できませんでした。)私が使用したい

は、コンポーネントを反応させるのがより容易ビューで入れ子構造をレンダリングするために作ります。

関連する問題