1

私はルビーとレールにかなり慣れていないので、最初のアプリケーションを構築しています。すべてのエージェント契約を調べて、最も早く期限が切れる順に並べ替えるメソッド (enroll_again) があります。このメソッドは、[[Agentname, numdays]] を含む 2 次元配列を返します。すべてのアカウントのすべての契約に対して、このメソッドをより高いレベルで実行しようとしています。

<% @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 に答える