Ruby HABTM关联循环

问题描述

我想实现一个嵌套循环,在have中没有重复项并且属于许多关系

我有一个“广告系列”模型,对于每个广告系列,我也都有广告系列数据。

我想在表格中显示每个广告系列及其广告系列数据。 (嵌套)

@campaigns = current_user.campaigns
 <% @campaigns.each do |item| %>
          <% i = item.campaign_data %>
            <% i.each do |cdata| %>
            <%= cdata.date %>
            <tr>
              <td>
              <%= item.name %>
              </td>
              <td>
              <%= cdata.date %>
              </td>
              <td>
              </td>
            </tr>
          <% end %>
          <% end %>

我的问题是我的广告系列重复了。

我想实现以下目标:

表中列出了每个广告系列,并在其正下方显示了相应的campaign_data,如果没有剩余的campaign_data,则下一个循环从下一个广告系列开始-可以吗?

最诚挚的问候

解决方法

<%= item.name %>循环中使用<% i.each do |cdata| %>时,您可能会获得重复的广告系列。因此,如果一个广告系列包含4个campaign_datas,则您将看到该广告系列名称4次。

您应该正确使用命名约定,如果广告系列包含大量数据campaign_data,则应关联指定has_many :campaign_datas

此外,以下代码应在控制器中

@campaigns = current_user.campaigns.include(:campaign_datas)

注意:-我使用include来避免n + 1,请阅读here

可见

<% for campaign in @campaigns %>
  <% next if @campaigns.campaign_datas.blank? %>
  <tr>
    <td><%= item.name %></td>
  </tr>
  <% for campaign_data in @campaigns.campaign_datas %>
    <tr>
      <td><%= campaign_data.date %></td>
    </tr>
  <% end %>
<% end %>

注意:- <% next if @campaigns.campaign_datas.blank? %>行用于跳过没有广告系列数据的广告系列。