Rails在同一视图上循环多个实例变量

时间:2016-11-13 17:22:00

标签: ruby-on-rails

假设我有一个控制器事务:

@transactions = Transaction.all.group(:type)

@transaction_date_asc = Transaction.all.order(:DATE => :desc).group(:type)

@transaction_date_desc = Transaction.all.order(:DATE => :asc).group(:type)

在我看来,我需要循环所有3个实例。

我希望显示每种交易类型的最新和最旧金额或折扣。

<% @transactions do |transaction|%>
   transaction.type.name
    <%end%>

 <% @transaction_date_asc do |transaction_asc|%>
   transaction_asc.amount
    <%end%>

    <% @transaction_date_desc do |transaction_desc|%>
    transaction_desc.amount
    <%end%>

     <% @transaction_date_asc do |transaction_asc|%>
    transaction_asc.discount
    <%end%>

     <% @transaction_date_desc do |transaction_desc|%>
    transaction_desc.discount
    <%end%>

我应该如何放置循环,列和&lt;%end&gt;在我看来?

1 个答案:

答案 0 :(得分:1)

有人可能会想出一个更好的解决方案,但是从我的座位看,您需要在视图中对每个组进行查询才能获得第一个日期事务,但从好的方面来说,您只需要一个查询具有最后日期的交易的控制器。

@transactions = Transaction.group(:type).having('DATE = MAX(DATE)')

在视图中......

<% @transactions do |transaction| %>

  <% first_transaction = Transaction.where(type: transaction.type).order('transaction_date').first %>

  <%= transaction.type.name %>
  <%= first_transaction.amount %>
  <%= transaction.amount %>
  <%= first.transaction.discount %>
  <%= transaction.discount %>

<% end %>

但是......要保持视图中的逻辑清洁,您可以使用一个实例方法来处理将返回第一个和最后一个事务的事务类型。

class Type << ActiveRecord::Base

  def first_transaction
    Transaction.where(type: self).order('transaction_date ASC').first
  end

  def last_transaction
    Transaction.where(type: self).order('transaction_date DESC').first
  end

end

然后在控制器......

@types = Type.all

然后在视图中......

<% @types.each do |type| %>
  <%= type.name %>
  <%= type.first_transaction.try(:amount) %>
  <%= type.last_transaction.try(:amount) %>
  <%= type.first_transaction.try(:discount) %>
  <%= type.last_transaction.try(:discount) %>
<% end %>

我建议#try的原因是处理特定类型没有交易的情况。