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

请使用acts_as_tree 或祖先宝石。这个http://railscasts.com/episodes/262-trees-with-ancestry应该给你你需要的信息。

于 2013-07-05T09:23:45.283 回答
1

如果我没有误解您的要求(表格组织为树),我对类似问题有一些想法并与朋友讨论过。请注意,无论如何,这是一个不那么小的问题,有多种方法可以面对它。我比较喜欢的是这个:

创建一个新表并将其命名为 product_products。通过这种方式,您可以获得一个重点:您可以在多个父级中拥有一个产品(这可能会发生),并且您可以“轻松”构建嵌套级别。请注意,您仍然需要设置深度限制(否则您必须以某种方式阻止循环引用),以避免循环引用破坏您的服务器。

为了打印出来,为了清理你的头脑,我建议你使用递归方法(在这种情况下是一个助手)。

例如(基于您当前的表结构,而不是我建议的表结构):

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

请考虑它的伪代码,这只是如何解决问题的基本思路。您还可以阅读这两个宝石:祖先acts_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 回答
1

我发现对 ActiveRecord 关系的理解非常缺乏。

在表中使用外键不适用于多个所有权。您可能需要创建一个一对多的关联。

http://guides.rubyonrails.org/association_basics.html

于 2013-07-04T22:46:57.000 回答