>

시험을 소유 한 카테고리를 소유 한 그룹이 있습니다.

이 코드를 실행하면 해당 그룹 루프 내에서 시험을 호출하는 대신 시험을 소유하지 않은 그룹에 시험이 분산됩니다.

<%  @header_groups.order("slug ASC").each do |group| %>
  <li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#" id="dropdown-3" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      <%= group.name %><span class="caret"></span>
    </a>
    <div class="dropdown-menu" aria-labelledby="dropdown-3">
      <%  @header_exams.where(group: group.id).each do |exam| %>
          <a class="dropdown-item" href="/<%= exam.group.slug %>/<%= exam.slug %>/">
            <%= exam.name %>
          </a>
          <!--TODO: use <a class="active"> to denote the current page and possibly category-->
        <% end %>
      <div class="dropdown-divider"></div>
      <a class="dropdown-item" href="/<%= group.slug %>/">
        All <%= group.name %>
      </a>
    </div>
  </li>
<% end %>

내 컨트롤러에서 정의했습니다

@header_groups = Group.where(published: TRUE)
@header_exams = Exam.where(published: TRUE)

내 참조 구조에서 내가 뭘 잘못하고 있는지 아십니까?

수정 : 아래에 모델 관계가 추가되었습니다.

그룹 모델

   has_many :categories, :dependent => :destroy
    has_many :exams, through: :categories, :dependent => :destroy
    accepts_nested_attributes_for :categories

카테고리 모델

   belongs_to :group
    has_many :exams, :dependent => :destroy

시험 모델

   belongs_to :category
    has_one :group, through: :category

  • 답변 # 1

    위의 데이터 관계를 바탕으로 간단하게 생각합니다. 아래는 위의 문제에 대한 샘플 코드입니다.

    컨트롤러에서 조건을 조인 할 수 있습니다. 또한 쿼리를 열망하여 데이터베이스가 한 번만 호출되었습니다

    아래는 컨트롤러 샘플입니다

    @header_groups = Group.joins(categories: :exams).
                     where("groups.published = ? AND exams = ?",true,true).
                     order("slug")
    
    

    보기는 @header_groups만을 기준으로 볼 것입니다. 시험을 받으려면 @header_examps = group.exams를 사용할 수 있습니다 (모델 관계에서 group has_many exam이라는 범주를 모델별로 언급했음을 기억하십시오)

    <%  @header_groups.each do |group| %>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="dropdown-3" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          <%= group.name %><span class="caret"></span>
        </a>
        <div class="dropdown-menu" aria-labelledby="dropdown-3">
          <% @header_examps = group.exams %>
          <%  @header_exams.each do |exam| %>
              <a class="dropdown-item" href="/<%= exam.group.slug %>/<%= exam.slug %>/">
                <%= exam.name %>
              </a>
              <!--TODO: use <a class="active"> to denote the current page and possibly category-->
            <% end %>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="/<%= group.slug %>/">
            All <%= group.name %>
          </a>
        </div>
      </li>
    <% end %> 
    
    

    최종 작업 코드로 원본 포스터에서 업데이트 :

    나를 위해 일한 것은이 대답의 약간의 변형이었습니다. (위의 답변은 각 그룹이 아닌 모든 시험에 대해 전체 그룹 루프를 반복했습니다.)

    컨트롤러 :

       @header_groups_v3 = Group.where(published: TRUE).
             order("slug")
    
    

    보기 :

       <%  @header_groups_v3.each do |group| %>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="dropdown-3" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              <%= group.name %><span class="caret"></span>
            </a>
            <div class="dropdown-menu" aria-labelledby="dropdown-3">
              <% @header_examps = group.exams %>
              <%  @header_examps.each do |exam| %>
                <a class="dropdown-item" href="/<%= exam.group.slug %>/<%= exam.slug %>/">
                  <%= exam.name %>
                </a>
                  <!--TODO: use <a class="active"> to denote the current page and possibly category-->
              <% end %>
              <div class="dropdown-divider"></div>
              <a class="dropdown-item" href="/<%= group.slug %>/">
                All <%= group.name %>
              </a>
            </div>
          </li>
        <% end %>
    
    

  • 답변 # 2

    코드를 대체하고 관련없는 비트를 생략하면 내가 읽는 것은 다음과 같습니다.

    Group.where(published: TRUE).each do |group|
      Exam.where(published: TRUE, group: group.id).each do |exam|
      end
    end
    
    

    Exam 때문에 약간 혼란스러운   :group 가 없습니다  칼럼, 그러나 Exam.where(group:) 가 있습니다  ActiveRecord 쿼리.

    ActiveRecord->SQL 쿼리로 들어가는 대신 다음과 같은 작업을 먼저 시도해보십시오 :

    Group.where(published: true).includes(:exams).each do |group|
      group.exams.each do |exam|
      end
    end
    
    

관련 자료

  • 이전 java - Akka-HTTP 템플릿을 찾을 수 없습니다
  • 다음 php - 내 웹 사이트에서 이미지를 볼 수 없습니다