0

我有三个模型。一个是员工,一个是项目,一个是同时属于员工和项目的事务。这是一个简单的应用程序,允许员工签入和签出项目 - “交易”有一个用于签入/签出的布尔列。

我要做的是在员工/显示视图中显示员工已签出的当前项目列表。这是我草拟的一些粗略代码,但我不确定它是否会起作用,而且我被告知无论如何不要在我的视图中使用大量嵌套条件。

    <% if @employee.transactions.exists? %>
        <h3>Currently Checked-OUT Items</h3>
        <table>
            <tr>
                <th>Item Asset Tag</th>
                <th>Item Description</th>
            </tr>
        <% @employee.transactions.each do |transaction| %>
            <% if item.transaction.last? && transaction.status == false %>
                <tr>
                    <td><% transaction.assettag %></td>
                    <td><% transaction.description %></td>
                </tr>
            <% else %>
            NO CHECKED OUT ITEMS
            <% end %>
        </table>
        <% end %>
    <% end %>   

基本上,我正在尝试:

  • 检查所有员工交易
  • 比较事务中涉及的项目并查看它是否是项目的.last 事务记录
  • 如果是,如果它是 false,那么它是当前结帐。

对于 Transaction 模型中的范围或辅助方法,这是一个更好的工作吗?我也从未使用过,我对rails真的很陌生。

4

2 回答 2

1

你应该在这里做几件事。

首先 - 创建一个范围,它将为您获取最后一个项目交易。如果您只对最后一项感兴趣,那么进行所有项目交易是没有意义的,对吧?

其次,使用部分。在这个例子中,很难展示我将如何重构代码来使用它们(有些事情在这里没有意义,例如 item 变量来自哪里?)

范围示例(取最后一笔交易)

@item.transactions.order('created_at DESC').first

您还可以添加签入/签出范围

class Transaction
    scope :checkin, -> { where(status: true) }
    scope :checkout, -> { where(status: false) }
end
于 2013-06-14T17:33:12.513 回答
0

首先,你在正确的轨道上。当视图由于大量嵌入的 ruby​​ 条件等而变得丑陋且难以阅读时,请考虑将逻辑移入帮助程序。

如果您有一个典型的 Rails 应用程序,那么您已经有了 app/helpers/application_helper.rb

所以你可以在那个文件中创建一个助手

def make_employee_list(employee)

   if employee.transactions.exists?
     content_tag(:div) do
       content_tag(:h3, "Currently Checked-OUT Items")
       content_tag(:table) do
         employee.transactions.each do |transaction|
           #  you get the idea
         end
       end
     end
   end
end

然后在您看来,您可以这样做:

<%= make_employee_list(@employee) %>
于 2013-06-14T16:07:12.760 回答