我有三个型号。一个是Employee,一个是Item,一个是属于Employee和Items的Transaction。这是一个简单的应用程序,允许员工签入和签出项目 - “交易”有一个布尔列,用于签入/签出。
我要做的是在employee / show视图中显示Employee已检出的当前项目列表。这是我概述的一些粗略的代码,但我不确定它是否会起作用,并且我被告知不要在我的视图中使用很多嵌套条件。
<% 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 %>
基本上,我正在尝试:
对于Transaction模型中的作用域或辅助方法,这是一个更好的工作吗?我从来没用过,我是铁杆的新人。
答案 0 :(得分:1)
你应该在这里做几件事。
首先 - 创建一个范围,为您提取最后一项交易。如果您只对最后一项交易感兴趣,那么进行项目交易没有意义,对吗?
其次,使用部分。在这个例子中很难说明我将如何重构代码以使用它们(有些事情在这里没有意义,例如,项目变量来自哪里?)
范围示例(采取上次交易)
@item.transactions.order('created_at DESC').first
您还可以为checkin / checkout添加范围
class Transaction
scope :checkin, -> { where(status: true) }
scope :checkout, -> { where(status: false) }
end
答案 1 :(得分: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) %>