2013-02-20 94 views
1

我对Ruby和Rails非常陌生,并且正在构建我的第一个应用程序。我有一个方法(enroll_again),它通过了所有的代理合同,并对它们进行排序,最后到期。此方法使用[[Agentname,numdays]]返回2d数组。我试图在所有帐户的所有合约上以更高级别运行此方法。通过多个二维数组并对它们进行排序

<% @accounts.each do |account| %> 
    <% account.contracts.enroll_again.each do |x,y| %> 
     <li> 
      <%= "#{y} Days remain on \n #{x}" %> 
     </li> 
    <%end%> 
<%end%> 

上面的代码返回特定于帐户的排序元素列表,但整个列表仍未排序。我试着将enroll_again返回的所有元素放到一个单独的数组中,但是我的语法必须是错误的,因为它总是返回一个空列表。
编辑:

def self.enroll_again 
    d= Date.today 
    contract = Contract.all 
    temp = contract.map do |x| 
    [ 
     Account.where(:accounts => { :id => x.account_id }).first.name), 
     ((Date.strptime(x.startd,'%m/%d/%Y') + x.duration.months)-d).to_i 
    ] 
    end 
    temp.sort_by{|x,y|y} 
end 
+0

哪个数据库? – 2013-02-21 00:31:41

回答

0

你应该能够做到以下几点

<% @accounts.each do |account| %> 
    <% account.contracts.sort_by(&:remaining_days).each do |contract| %> 
    <li> 
     <%= "#{contract.remaining_days} Days remain on \n #{account.name}" %> 
    </li> 
    <%end%> 
<%end%> 

def remaining_days 
    @remaining_days ||= ((Date.strptime(startd,'%m/%d/%Y') + duration.months) - Date.today).to_i 
end 

我认为这是比较容易理解,再加上你可以重复使用remaining_days方法。

0

您应该能够在数据库级别执行排序。我假设你想根据合同剩下的日期对结果进行排序。

def self.enroll_again 
    days_left = "DATEDIFF(DATE_ADD(contacts.startd, INTERVAL x.duration MONTHS), CURDATE())" 
    Contract.select("accounts.name account_name, #{days_left} days_left"). 
    joins(:account).order("days_left DESC"). 
    map {|c| [c.account_name, c.days_left]} 
end 

我假设你正在使用MySQL数据库。

+0

是的,我没有很好地计划数据库,我的日期是现在的字符串 – MattLock 2013-02-21 01:27:01

相关问题