ruby-on-rails 在循环中显示嵌套模型中的对象

f0ofjuux  于 2023-05-08  发布在  Ruby
关注(0)|答案(1)|浏览(142)

我的应用程序中有一个名为Tracker的模型,下面有一个名为Email的嵌套模型。我想创建一个视图页面,在那里我可以看到我的每个跟踪器与所有相关的电子邮件下面。
我创建了一个循环来显示我所有的跟踪器,然后在两者之间添加一个循环来显示电子邮件,但是它向我显示了所有的电子邮件,而不仅仅是与该跟踪器相关的电子邮件。
下面是我认为出错的视图页面的代码:

<div class="card">
  <% @trackers.each do |tracker| %>
  <b><%= tracker.title %> <%= tracker.emails.count %></b>
      <ol><% for emails in @tracker %>
        <li>I'd like the email subject to appear here!</li>
      <% end %><ol>
    <% end %>
</div>

下面是我的视图页面的控制器:

class PagesController < ApplicationController

  def inbox
    @emails = Email.order('date_sent ASC')
    @email = Email.order('date_sent ASC')
    @trackers = Tracker.all
    @tracker = Tracker.all
  end

谢谢你的帮助!

kse8i1jr

kse8i1jr1#

我认为表之间的关系(跟踪器有_许多电子邮件)
这里是代码

<div class="card">
    <% @trackers.each do |tracker| %>
    <b><%= tracker.title %> <%= tracker.emails.count %></b>
        <ol>
          <% tracker.emails.each do |email| %>
            <li><%= email.subject %></li>
          <% end %>
        <ol>
      <% end %>
  </div>

编辑2:

<div class="card">
    <% @trackers.each do |tracker| %>
    <b><%= tracker.title %> <%= tracker.emails.count %></b>
        <ol>
          <% email = tracker.emails.order('date_sent DESC').last %>
          <li><%= email.subject if email.present? %></li>
        <ol>
      <% end %>
  </div>

备注:

  • 如果你想显示与跟踪器相关的电子邮件,那么你必须编写tracker.emails,而不是查询电子邮件模型
  • 如果你想要最后一封电子邮件,那么你必须用DESC而不是ASC订购
  • 如果你只想要一条记录,那么你写last而不是limit(1),但意义仍然相同
    其他提示(可能是你想了解更多)

@trackers = Tracker.all.includes(:emails)
如果你加载Tracker和与Tracker相关电子邮件,它将创建n+1个查询,这对于附加命令includes(:emails)是没有效率的,它将执行1个查询,这会更快。
(What是n+1查询吗?当我们从数据库中加载一个记录集合时,会发生n+1查询,并且该集合中的每个记录都有一个相关记录。第一个查询从数据库加载记录集合,然后对每n条记录执行一个附加查询)
如果我只想显示来自每个跟踪器的最新电子邮件-我有一个date_sent对象。计数我在控制器中执行@email = Email.order('date_sent ASC').limit(1)或<% tracker.emails.order('date_sent ASC').limit(1)这样的操作|电子邮件|%>在循环中?目前它不显示我的任何电子邮件,但不给予我一个错误。

相关问题