子类别循环

时间:2012-10-09 05:00:09

标签: ruby-on-rails

我有以下控制器检索"子类别",然后循环遍历每个子类别,抓取并存储我所称的"圆圈"到实例变量

  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

2 个答案:

答案 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) }

它会返回你的圆圈阵列。