1

我对 ruby​​ 和 rails 很陌生,我正在构建我的第一个应用程序。我有一个方法(enroll_again),它遍历所有代理合同并对它们进行排序,其中最快到期。此方法返回一个带有 [[Agentname, numdays]] 的二维数组。我正在尝试在更高级别上为所有帐户的所有合同运行此方法。

<% @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 
4

2 回答 2

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 数据库。

于 2013-02-21T00:47:42.587 回答
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 方法。

于 2013-02-21T00:29:26.103 回答