问题描述
我想实现一个嵌套循环,在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? %>
行用于跳过没有广告系列数据的广告系列。