Ruby foreach on last parent

时间:2018-02-12 00:27:30

标签: 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          |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

我希望在最终结果中

Category 2
   Subcat23
   Subcat24
Category 3
   Subcat31

所以我需要帮助才能知道如何获取此日期以及如何执行foreach我尝试了很多方法,例如includesjoins但这样做无效。欢迎任何建议。

编辑1 我尝试Subash解决方案(编辑1)它几乎工作,只使用主类别显示,但所有子类别出现在列表中。我也想隐藏没有使用过的子类别。

我得到了这个结果

Category 2
   Subcat23
   Subcat24
   Subcat25
Category 3
   Subcat31

在我的情况下,我没有子类别 Subcat25 的产品。在我的列表中不要 Subcat25

这是我的观点

<% @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 %>

1 个答案:

答案 0 :(得分:1)

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

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

here是指南的链接

编辑1

我确定使用joins这是一种非常有效的方法,但我想这里现在有用了

    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

这一行(categories[sub_cat.category.id] ||= []) << sub_cat只是向数组中添加项目,如果找不到数组,则先创建它然后再添加到数组中,

您可以迭代categories并随意显示。