繁体   English   中英

如何在 Rails 中使用 Espinita 迭代多个哈希值

[英]How to iterate over multiple hash values with Espinita in Rails

我正在使用Espinita来跟踪对我的模型所做的更改,并且有多个我想在视图中显示的属性。

我还没有弄清楚如何在不使用||情况下迭代每个值在迭代器中。 我想获取属性名称、更改的值和日期。

这是 show.html:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :action_requested..:deadline]).each do |changes| %>

<tr>
  <%= changes[:contract_title] || changes[:assigned_to] || changes[:deadline] %>
  <%= changes[:changed_at].strftime("%m/%d/%Y") %>
</tr>
<% end %>

如何在不引用属性名称的情况下迭代每个审计?

更新

进行建议的更改后。 我现在以数组形式接收属性/值。 有没有办法美化视图中的结果?

输出

11/20/2019  [:contract_stage, ""] [:action_requested, ""] [:reason_for_contract_request, ""] [:existing_or_returning, ""] [:background_check_status, ""] [:priority, ""] [:deadline_date, Wed, 20 Nov 2019] [:commencement_date, Wed, 20 Nov 2019]  davie200

看法

 <% @contract.contract_information.history_from_audits_for([:contract_stage, :action_requested, :reason_for_contract_request, :deadline_date, :commencement_date, :existing_or_returning, :background_check_status, :priority]).each do |audit| %>
          <% audit.except(:changed_at).each do |attribute, value| %>
            <tr>
             <td><%= audit[:changed_at].strftime("%m/%d/%Y") %></td>
              <td>
                <% value.each do |val| %>
                  <%= val %>
                <% end %>
              </td>
              <td><%= @contract.contract_information.audits.last.user.username %></td>
            </tr>
          <% end %>
        <% end %>

如果您有机会在您的项目中更新 Espinita,我建议您这样做,因为它们更改了history_from_audits_for返回的哈希格式

在较新的版本中,您将在“ 历史和恢复”文档中看到类似的内容:

model.history_from_audits_for([:name, :settings])
=> [{:changes=>{:name=>"Baz", :settings=>""}, :changed_at=>2015-05-03 15:33:58 -0700},
 {:changes=>{:name=>"Arglebargle", :settings=>"IHOP"}, :changed_at=>2015-03-24 15:33:58 -0700},
 {:changes=>{:name=>"Walrus"}, :changed_at=>2014-05-13 15:33:58 -0700}]

您的迭代将非常简单:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :deadline]).each do |audit| %>
  <% audit[:changes].each do |attribute, value| %>
    <tr>
      <%= value %>
      <%= audit[:changed_at].strftime("%m/%d/%Y") %>
    </tr>
  <% end %>
<% end %>

但是,如果您没有机会并且使用 Rails > 3.0.0,请考虑以下方法:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :deadline]).each do |audit| %>
  <% audit.except(:changed_at).each do |attribute, value| %>
    <tr>
      <%= value %>
      <%= audit[:changed_at].strftime("%m/%d/%Y") %>
    </tr>
  <% end %>
<% end %>

使用Hash#except

从审计中检索用户

<%= @contract.contract_information.audits.last.user.username %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM