【问题标题】:How to dry code?如何干代码?
【发布时间】:2015-06-17 07:52:54
【问题描述】:

我正在使用的应用程序中有许多通过关联。 我从 InventoryController 的 INDEX 操作中的员工表访问电子邮件,如下代码:

<% @inventories.each do |inventory| %>
    <% inventory.employee_inventories.each do |e| %>
            <%if e[:status]== 'ALLOTED'%>
                  <%= e.employee.email%>
             <% end %>
    <% end %>
<% end %>

请帮助我如何在视图中干燥此代码?提前致谢

【问题讨论】:

  • 也许您可以将scope 添加到查询status == 'ALLOTED' 记录的相应模型中,并在此视图中使用该范围。

标签: ruby ruby-on-rails-4 views dry


【解决方案1】:
@alloted_emails = @inventories.flat_map(&:employee_inventories).select do |i|
  i[:status] == 'ALLOTED'
end.map do |i|
  i.employee.email
end

除非您想按照@Pavan 的建议创建范围,否则只需引入此 var 并使用它。

【讨论】:

    【解决方案2】:

    如果您在不同的视图中使用相同的代码,那么您可以创建一个帮助器。

    否则像这样写下这段代码-

    <% @inventories.each do |inventory| %>
      <% inventory.employee_inventories.each do |e| %>
          <%= e.employee.email if e[:status]== 'ALLOTED' %>     
      <% end %>
    <% end %>
    

    您的代码中的主要问题是 n+1 查询问题。如果您使用的是预先加载,则没有问题,否则在查询中使用包含关键字使用预先加载。

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多