Rails:如何在一个循环中访问两个模型

Posted

技术标签:

【中文标题】Rails:如何在一个循环中访问两个模型【英文标题】:Rails: How to access two models in a single loop 【发布时间】:2018-02-06 23:30:21 【问题描述】:

我正在使用 Audited gem 来跟踪对用户所做的更改。我想要准确显示的是所做的更改,即审核与它们在同一行中更新的时间。我试图以这种方式显示它,但它会重复。

<% @users.each do |user| %>
  <% user.audits.each do |audit| %>
    <% if audit.action != "create" %>
    <% user.revisions.each do |revision| %>
    <tr class="list-item">
      <td>
        <%= user.role %>
      </td>

      <td>
        <%= audit.action %>
      </td>

      <td>
        <%= audit.audited_changes %>
      </td>

      <td>
        <%= revision.created_at %>
      </td>

      <td>
        <%= revision.updated_at %>
      </td>
    </tr>
      <% end %>
    <% end %>
  <% end %>
<% end %>

我想要的是能够在不显示单个更改多次的情况下显示它们。

我正在寻找像

这样的表达方式
for(i=5,j=3;j<5;i++,j++)
     ....

在rails中,避免重复。谢谢你

【问题讨论】:

【参考方案1】:

我以这种方式解决了它,因为审计和修订具有相同数量的元素。我希望它对其他人有所帮助。

<% @users.each do |user| %>
      <% user.audits.each_with_index do |audit, i| %>
        <% if audit.action != "create" %>
        <% user.revisions[i] %>
        <tr class="list-item">
          <td>
            <%= user.role %>
          </td>

          <td>
            <%= audit.action %>
          </td>

          <td>
            <%= audit.audited_changes %>
          </td>

          <td>
            <%=user.revisions[i].created_at %>
          </td>

          <td>
            <%= user.revisions[i].updated_at %>
          </td>
        </tr>
        <% end %>
      <% end %>
    <% end %>

【讨论】:

【参考方案2】:

你也可以试试zip:

user.audits.zip(user.revisions) do |audit, revision|

【讨论】:

以上是关于Rails:如何在一个循环中访问两个模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何让两个用户 ID 与模型相关联

Rails:如何跨视图访问模型和控制器数据?

如何在 Rails 2.3 中的 .each 循环中排序

在 Rails 中,如何编写一个带有“where”的查找器来比较两个日期?

rails 在两个表中划分循环。导轨视图,新手

如何在记录付款和运行余额的 Rails 模型中避免竞争条件?