首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过双嵌套字段引用返回错误的结果。

通过双嵌套字段引用返回错误的结果。
EN

Stack Overflow用户
提问于 2019-03-03 11:06:30
回答 2查看 36关注 0票数 0

我有自己的小组,他们拥有自己的考试类别。

当我运行这段代码时,它不是在相应的Group循环中调用这些考试,而是在不拥有它们的组中分散考试。

代码语言:javascript
复制
<%  @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 %>

在我定义的控制器内

代码语言:javascript
复制
@header_groups = Group.where(published: TRUE)
@header_exams = Exam.where(published: TRUE)

知道我在参考结构上做错了什么吗?

编辑:模型关系添加到下面。

群模型

代码语言:javascript
复制
    has_many :categories, :dependent => :destroy
    has_many :exams, through: :categories, :dependent => :destroy
    accepts_nested_attributes_for :categories

范畴模型

代码语言:javascript
复制
    belongs_to :group
    has_many :exams, :dependent => :destroy

考试模型

代码语言:javascript
复制
    belongs_to :category
    has_one :group, through: :category
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-03 17:52:03

基于以上数据关系,我认为您简化了,下面是上面问题的示例代码。

在您的控制器中,您可以加入条件,这也迫切地加载了您的查询,因此您的数据库只调用一次。

下面是控制器的示例

代码语言:javascript
复制
@header_groups = Group.joins(categories: :exams).
                 where("groups.published = ? AND exams = ?",true,true).
                 order("slug")

您的视图将只查看@header_groups,要获得考试,可以使用@header_examps = group.exams (请记住,您在模型关系中也提到了通过类别分组has_many考试)

代码语言:javascript
复制
<%  @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 %>  

用最终工作代码更新原始海报:

最后为我工作的是这个答案的一个细微的变体。(上面写的答案重复了每一次考试的整个小组循环,而不仅仅是每个小组。)

主计长:

代码语言:javascript
复制
    @header_groups_v3 = Group.where(published: TRUE).
         order("slug")

查看:

代码语言:javascript
复制
    <%  @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
EN

Stack Overflow用户

发布于 2019-03-03 13:36:39

有了一些代码替换和省略了不相关的部分,我所读到的是:

代码语言:javascript
复制
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查询,您是否可以先尝试这样做:

代码语言:javascript
复制
Group.where(published: true).includes(:exams).each do |group|
  group.exams.each do |exam|
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54968162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档