通过多个二维数组并对它们进行排序
问题描述:
我对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
答
你应该能够做到以下几点
<% @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方法。
答
您应该能够在数据库级别执行排序。我假设你想根据合同剩下的日期对结果进行排序。
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
哪个数据库? – 2013-02-21 00:31:41