【问题标题】:Ruby HABTM association loopRuby HABTM 关联循环
【发布时间】:2020-11-11 09:30:51
【问题描述】:

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

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

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

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

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

我想实现这样的目标:

每个活动都列在表格中,其对应的活动数据直接位于其下方,如果没有活动数据,则下一个循环从下一个活动开始 - 这可能吗?

最好的尊重

【问题讨论】:

    标签: ruby-on-rails ruby associations has-and-belongs-to-many


    【解决方案1】:

    当您在 &lt;% i.each do |cdata| %&gt; 循环中使用 &lt;%= item.name %&gt; 时,您可能会收到重复的广告系列。因此,如果一个活动有 4 个活动数据,您将看到活动名称 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 %>
    

    注意:- &lt;% next if @campaigns.campaign_datas.blank? %&gt; 行用于跳过没有活动数据的活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多