1

この単純な配列をactiverecordから配信しました

[#<Product id: 1, parent_id: , text: "Hurray">, #<Product id: 2, parent_id: 1, text: "Hurray again">, #<Product id: 3, parent_id: 1, text: "Hurray again 2">, #<Product id: 4, parent_id: 2, text: "Boo yeah !">] 

ご覧のとおり、各エントリにはparent_id. ここでのアイデアは、Productをその子製品と一緒にグループ化することです。現在、子製品を識別する方法は、そのparent_idです。たとえば、Product 2's親製品はProduct 1です。

これで、以下に示すように、結果が配信されるように、データベースとコントローラーのすべてのアクションをセットアップしました。

とはいえ、簡単な形式で詳細を表示することは今できません。おそらくRails erbページのように見えるはずです

1. Product 1 has products
2. Product 2 has products
   1. Product 4
3. Product 3 has products
   Nil
4. Product 4 has products 
   Nil

すべての製品のループを実行して、 if 条件を次のように設定してみif n.parent_id.present?ました。しかし、結果が複数のレベルであり、結果が常に異なることを期待していることがわかります。

ここでのヘルプやガイダンスは大歓迎です。

ありがとう

更新:私が試したのはこれです

<%@products.each do |n|%>
    <li><%=Product "#{n.id}" has products%></li>
        <%if n.parent_id.present?%>
        <li><%=Product "#{n.id}" has products%></li>
        <%end%>
<%end%>

ここで見られる問題は、レベルが深すぎる場合に if/else を使用し続けることができないことです。つまり、製品のスレッド ベースのビューを表示しようとしています。

私が理にかなっていることを願っています:)。

4

3 に答える 3

2

act_as_tree または ancestry gem を使用してください。このhttp://railscasts.com/episodes/262-trees-with-ancestryは、必要な情報を提供するはずです。

于 2013-07-05T09:23:45.283 に答える
1

あなたが求めていることを誤解していなければ (テーブルはツリーとして編成されています)、同様の問題についていくつか考え、友人と話し合いました。とにかく、それはそれほど小さくない問題であることに注意してください。それに直面するにはさまざまな方法があります。私が好むものはこれです:

新しいテーブルを作成し、product_products という名前を付けます。このようにして、1 つの重要なポイントが得られます。複数の親に 1 つの製品を含めることができ (これが発生する場合もあります)、ネストされたレベルを「簡単に」構築できます。ループ参照がサーバーを破壊するのを避けるために、深さの制限を設定する必要があることに注意してください (または、何らかの方法でループ参照をブロックする必要があります)。

それを出力するには、頭を整理するために、再帰的な方法(この場合はヘルパー)を使用することをお勧めします。

例(私が提案したものではなく、現在のテーブル構造に基づく):

def tree_print(products)
    products.each do |product|
        nested_tree_print(product)
    end
end

def nested_tree_print(product)
    print product.name
    nested_tree_print(product) unless product.parent_id.nil?
end

疑似コードと考えてください。これは、問題を解決するための基本的な考え方にすぎません。次の 2 つの gem についても読むことができます: ancestryact_as_tree

更新 1

あなたのコメントを読んだ後Product has_many products、ここにいくつかの疑似コードがあるとしましょう:

def tree_print(products)
    products.each do |product|
        nested_tree_print(product)
    end
end

# Consider this like a private method, you should use the other in views
def nested_tree_print(product)
    product.products.each do |printable_product|
        print printable_product.name
        nested_tree_print(product) unless product.parent_id.nil?
    end
end

このコードは最適化されていないことに注意してください。多くの製品がない場合 (すべてをメモリにキャッシュすることで多くのメリットが得られます)、簡単にスタック オーバーフローが発生する可能性があるため、最大深度を確認する必要があります。

于 2013-07-04T22:49:21.403 に答える