2013-02-20 77 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

相關問題