我是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
我尝试了很多方法,例如includes
和joins
但这样做无效。欢迎任何建议。
编辑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 %>
答案 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
并随意显示。