通过双嵌套字段进行引用会返回错误的结果

时间:2019-03-03 11:06:30

标签: ruby-on-rails

我有拥有考试类别的小组。

当我运行此代码时,它没有在各自的Group循环中调用考试,而是将考试分散在不属于它们的Group中。

<%  @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 :(得分:0)

通过一些代码替换并省略不相关的位,我正在读取的内容是:

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

答案 1 :(得分:0)

根据上面的数据关系,我想您很简单,下面是上面的问题的示例代码

您可以在控制器中加入条件,这也渴望加载查询,因此您的数据库仅被调用一次

下面是您的控制器的示例

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