0

「サブカテゴリ」を取得し、各サブカテゴリをループして、「円」と呼んでいるものを取得してインスタンス変数に格納する次のコントローラがあります。

  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
4

2 に答える 2

1

IMOあなたはただ結合を使うべきです:

@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しかし、上に示したように、1つのクエリでそれを行う方がよいでしょう。

ペーストビンに基づく更新:

を設定する必要はありません@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クエリの問題を防ぐには、コントローラでこれを行う必要があります。

@sub_categories = Category.includes(:circles).where(:parent => params[:id])
于 2012-10-09T05:05:28.060 に答える
0

それぞれがイテレータです

選択したサブカテゴリのを収集するので、次のように簡単に書くことができます。

@subcategories.collect{|sc| Circle.where(:category_id => sc.id) }

円の配列を返します。

于 2012-10-09T05:05:35.507 に答える