我的代码完美无缺,然而,我知道我的方法不是最佳实践。我很感激任何试图详细解释如何使用(演示者,装饰者或者poros)重构此代码的人的努力 - 我对这两者都没有深刻的理解。 以下是代码:
在我的事件控制器中,我有一个名为tickets_report
的方法,如此
def tickets_report
@all_bookings = @event.bookings
@ticket_types = @event.ticket_types
@attendees = @event.attendees
end
然后,我在视图中使用@ticket_types
实例变量来绘制表格,如下所示:
<tbody>
<% grand_quantity = ticket_left = quantity_sold = total_price = total_amount = 0 %>
<% @tickets.each_with_index do |ticket, index| %>
<% remains = ticket.quantity.to_i - ticket.user_tickets.count.to_i
amount = ticket.price.to_f * ticket.user_tickets.count.to_i
grand_quantity += ticket.quantity
ticket_left += remains
quantity_sold += ticket.user_tickets.count
total_price += ticket.price.to_f
total_amount += amount
%>
<tr>
<td><%= index + 1%></td>
<td><%= ticket.name %></td>
<td><%= ticket.quantity %></td>
<td><%= remains %></td>
<td><%= ticket.user_tickets.count %></td>
<td><%= number_to_currency(ticket.price)%></td>
<td><%= number_to_currency(amount)%></td>
</tr>
<% end %>
<tr class="gtotal">
<td colspan="2">Grand Total</td>
<td><%= grand_quantity %></td>
<td><%= ticket_left %></td>
<td><%= quantity_sold %></td>
<td><%= number_to_currency(total_price)%></td>
<td><%= number_to_currency(total_amount)%></td>
</tr>
</tbody>
我的问题是在视图中完成的计算确实不是一件好事,这就是我自己试图解决这个问题的程度
module Events
class Ticket
def initialize(ticket)
@ticket = ticket
end
def name
@ticket.name
end
def quantity
@ticket.quantity
end
def price
@ticket.price.to_f
end
def user_count
@ticket.user_tickets.count.to_i
end
def remains
@ticket.quantity.to_i - user_count
end
def amount
price * user_count
end
end
class TicketReportPresenter < Ticket
@@grand_quantity = @@ticket_left = @@quantity_sold = 0
@@total_price = @@total_amount = 0
def initialize(ticket)
@ticket = Ticket.new(ticket)
@@grand_quantity += @ticket.quantity.to_i
@@ticket_left += @ticket.remains
@@quantity_sold += @ticket.user_count
@@total_price += @ticket.price
@@total_amount ++ @ticket.amount
end
class << self
def grand_quantity
@@grand_quantity
end
def ticket_left
@@ticket_left
end
def quantity_sold
@@quantity_sold
end
def total_price
@@total_price
end
def total_amount
@@total_amount
end
end
end
end
我的控制器中的新tickets_report
方法
def tickets_report
@all_bookings = @event.bookings
@ticket_types = Events::TicketReportPresenter.new(@event.ticket_types.first)
@attendees = @event.attendees
end
然而,此时似乎没有正确的事情。例如,我无法在我定义的故障单对象上调用ActiveRecord关系。重构视图中存在的逻辑的最佳方法是什么,详细描述和源代码就足以加上其他资源的链接。谢谢。