我有以下控制器检索"子类别",然后循环遍历每个子类别,抓取并存储我所称的"圆圈"到实例变量
def show
@sub_categories = Category.where(:parent => params[:id])
@sub_categories.each do |sub_cat|
i = 1
@circles[i] = Circle.where(:category_id => sub_cat.id)
i++
end
end
这是输出错误。我来自PHP,并且不知道如何正确地做到这一点。
categories_controller.rb:9: syntax error, unexpected kEND
答案 0 :(得分:1)
IMO你应该使用join:
@circles = Circle.joins(:categories).where(:categories => { :parent_id => params[:id] })
要解决您编写的代码:使用<<
在Ruby中添加数组。所以你可以按如下方式重写你的代码:
@circles = []
@sub_categories.each do |sub_cat|
sub_cat.circles.each do |circle| # assumes Category has_many :circles
@circles << circle
end
end
但是你最好在一个查询中使用joins
,就像我在上面显示的那样。
基于pastebin更新:
无需设置@circles
。
这是你的观点应该是这样的:
<% @sub_categories.each do |sub_cat| %>
<div class="circle">
<header>
<h3 data-toggle="collapse" href="#<%= dom_id(sub_cat) %>-collapse"><%=sub_cat.name %></h3>
<ul id="<%= dom_id(sub_cat) %>-collapse" class="accordion-body collapse">
<li class="list-shadow"></li>
<% sub_cat.circles.each do |circle| %>
<li><%= link_to circle.title, circle, :remote => true, :method => 'get' %></li>
<% end %>
</ul>
</header>
</div><!--.circle-->
<% end %>
要阻止N+1 queries problem,您必须在控制器中执行此操作:
@sub_categories = Category.includes(:circles).where(:parent => params[:id])
答案 1 :(得分:0)
每个都是一个迭代器
因为你收集所选子类别的圈子,你可以简单地把它写成
@subcategories.collect{|sc| Circle.where(:category_id => sc.id) }
它会返回你的圆圈阵列。