Ruby on rails 最后一个父级上的Ruby foreach

Ruby on rails 最后一个父级上的Ruby foreach,ruby-on-rails,ruby,foreach,Ruby On Rails,Ruby,Foreach,我是Ruby新手,有个问题 场景:我有产品,一个产品属于一个子类别,子类别属于一个类别。我有多种产品。我想有一个唯一的列表,所有子类别使用其主要类别。我想知道如何获取数据以及如何进行foreach 我的桌子: Table Categories: id | name 1 |Category1 2 |Category 2 3 |Category 3 Table SubCategories id|category_id|name 1 |1 |Subcat11 2 |1

我是Ruby新手,有个问题

场景:我有产品,一个产品属于一个子类别,子类别属于一个类别。我有多种产品。我想有一个唯一的列表,所有子类别使用其主要类别。我想知道如何获取数据以及如何进行foreach

我的桌子:

Table Categories:
id | name
1  |Category1
2  |Category 2
3  |Category 3

Table SubCategories
id|category_id|name
1 |1          |Subcat11
2 |1          |Subcat12
3 |2          |Subcat23
4 |2          |Subcat24
5 |2          |Subcat25
6 |3          |Subcat31


Products
id|subcategory_id|name
1 |3             |Product1
2 |4             |Product2
3 |6             |Product3
我的模型:

 class Category < ActiveRecord::Base
      has_many :subCategories
      # attribs: id, name
    end

    class Subcategory < ActiveRecord::Base
      belongs_to :category
      # attribs: id, name, continent_id
    end

    class Products < ActiveRecord::Base
      belongs_to :Subcategory
      # attribs: id, name, country_id
    end
所以我需要帮助知道如何获得这个日期以及如何执行foreach。我尝试了很多方法,比如include和join,但都不起作用。欢迎提出任何建议

编辑1 我尝试了Subash解决方案编辑1它几乎可以工作,只使用了主类别显示,但所有子类别都显示在列表中。我还想隐藏“未使用”子类别

我得到了这个结果

Category 2
   Subcat23
   Subcat24
   Subcat25
Category 3
   Subcat31
在我的例子中,我没有子类别subcategory Subcat25的产品。在我的列表中,我不想要子目录25

这是我的看法

<% @categories.each do |category| %>
      <% if category.name != "" %>
      <a href="#<%= category.id %>" data-toggle="collapse" class="category">
        <p class="category-title">
        <%= category.name %>
        <i class="fa fa-minus" style="display:none;"></i>
        </p>
      </a>
      <div id="<%= category.id %>" class="collapse items">
        <% category.subcategories.sort_by {|subcategory| subcategory.display_order.to_i}.each do |subcategory| %>
        <p data-intervention-sector="<%= subcategory.id %>">
          <%= subcategory.name %>
        </p>
        <% end %>
      </div>
      <% end %>
    <% end %>

我建议您阅读ActiveRecord,您可以使用ActiveRecord的急切加载机制来实现这一点,并避免任何N+1查询问题

Category.includes(:subcategory).each do |category|
  puts category.subcategory
结束

是指向指南的链接

编辑1

我确信有一种非常有效的方法可以使用连接来实现这一点,但我想现在有一种方法是可行的

    Category.includes(:subcategory).where(id: Subcategory.where(id: Product.pluck(:subcategory_id).uniq).pluck(:category_id)) do |category|
      puts category
      puts category.subcategories
    end
编辑2

你可以试试这个

categories = {}
Product.pluck(:subcategory_id).uniq.each do |subcategory_id|
  sub_cat = Subcategory.includes(:category)
  (categories[sub_cat.category.id] ||= []) << sub_cat
end

此行类别[sub_cat.category.id]| |=[]我只想按我的产品显示使用过的子类别/类别。你的代码显示所有类别,对吗?我不想显示类别1和产品表中未使用的所有其他子类别。如果您有一百万个产品,您应该再次考虑使用Pulk。这就是为什么我提到要尝试使用joinsIt的几乎所有工作,只显示使用的主类别,但所有子类别都显示在列表中。我还想隐藏“未使用”子类别。在我的主要帖子中查看我的编辑1。谢谢:
categories = {}
Product.pluck(:subcategory_id).uniq.each do |subcategory_id|
  sub_cat = Subcategory.includes(:category)
  (categories[sub_cat.category.id] ||= []) << sub_cat
end