2016-11-13 72 views
0

让说我有一个控制器的交易: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%> 

在我看来,我该如何放置循环,列和<%end>?

+0

这些产品是如何相关的? – slowjack2k

+0

随着产品不会出现在我的脑海里的任何有意义的例子。我将编辑问题 – Catmal

+0

我仍然无法看到您的记录之间的连接。在我看来,你循环播放随机记录并显示它。所有这些记录之间有什么联系?他们分享相同的类型,ID或什么? – slowjack2k

回答

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的原因是处理没有交易的情况下,为特定类型而存在。

+0

嗨,谢谢你的回答。问题的关键在于理解视图中不同循环的用法。所以基本上循环多个实例变量不是可行的,但相反,当我需要应用不能一起存在的条件时(比如order asc和desc),正确的方法是设置一个局部变量或一个实例方法。我理解正确吗? – Catmal

+0

由于任何原因,通常不应使用多个实例变量。查看Sandi Metz的开发规则#4规则#https://robots.thoughtbot.com/sandi-metz-rules-for-developers – SteveTurczyn

+0

可以循环嵌套关系,但通常两个并发循环很具挑战性。在这些情况下你可以做的是在主循环中使用'#each_with_index',然后使用索引来访问其他集合中的元素。 – SteveTurczyn