Ссылка через двойные вложенные поля возвращает неверный результат - PullRequest
0 голосов
/ 03 марта 2019

У меня есть группы, которым принадлежат категории, которым принадлежат экзамены.

Когда я запускаю этот код, вместо вызова экзаменов в соответствующем цикле группы, он разбрасывает экзамены по группам, которым они не принадлежат.

<%  @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

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Исходя из ваших данных выше, я думаю, что вы просто, ниже пример кода для вашей проблемы выше

в вашем контроллере вы можете присоединять условия, это также нетерпеливо загружает ваш запрос, так что ваша база данных просто вызывается только один раз

ниже приведен пример для вашего контроллера

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

, и ваше представление будет отображаться только на основе @header_groups, для сдачи экзаменов вы можете использовать @header_examps = group.exams (помните, что вы также упоминали в своей моделиотношения, которые проходит группа (проходит множество экзаменов по категориям)

<%  @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 %>
0 голосов
/ 03 марта 2019

С некоторой подстановкой кода и пропуском ненужных битов я читаю:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...