2

目標: 3 つの関連付けられたモデルからの情報を含む Excel ドキュメントを生成します。これは、HTML テーブルにあるものと似ています。to_xls gem はこれを配列のリストとして必要とします。

https://github.com/splendeo/to_xls

望ましい出力:

(working for both)      (working for both)    (working in HTML, not in Excel)
territory.branch.name    territory.zip    territory.mailedcounts.maximum(:maileddate)
My Branch                90210            2012-05-01
My Branch                90211            2012-05-03
My Branch                90212            

ブランチには多くのテリトリーがあります。テリトリーには多くの Mailedcounts があります。

show.html.erb の組み込みの ActiveRecord メソッドを使用して、ビューに正しいデータを表示できます。

<% for territory in @territories %>
<tr>
  <td><%= territory.branch.name %></td>      
  <td><%= territory.zip %></td>
  <td><%= territory.mailedcounts.maximum(:maileddate) %></td>
</tr>
<% end >

これは私がこれまでに正しくエクスポートしたものです

class BranchesController < ApplicationController
.
.
.
 def show
  @branch = Branch.find(params[:id])
  @territories = @branch.territories

  respond_to do |format|
    format.html
    format.xls { 
      send_data @territories.to_xls(:columns => [ { :branch => :name }, :zip ] )
    }
 end
end

これにより、territory.branch.name とterritory.zip の両方が適切に機能します。地域から始めて、mailedcounts 情報を取得する方法がわかりません。

4

3 に答える 3

1

これは私のためにそれをした解決策です。(本来よりもはるかに多くの時間を試行した後。)

秘訣は、Territory モデルではなく、Mailedcount モデルでクラスを定義することでした。

class Mailedcount < ActiveRecord::Base
.
.
.
  belongs_to :branch
  belongs_to :territory

  class << self
    def max_maileddate
      maximum('maileddate')
    end
  end
end

コントローラーに戻り、そのメソッドを呼び出すことができます。

class BranchesController < ApplicationController
.
.
.
 def show
  @branch = Branch.find(params[:id])
  @territories = @branch.territories

  respond_to do |format|
  format.html
  format.xls { 
    send_data @territories.to_xls(:columns => [ { :branch => :name }, :zip,
                        { :mailedcounts => :max_maileddate } ] )
  }
    end
  end

本質的に別の結合との関係を再現しないと、Territory モデルで機能するスコープまたはメソッドを取得できませんでした。

于 2012-06-21T01:32:55.063 に答える
1

カスタムスコープを使用すると、これがうまくいくはずです。

class Territory < ActiveRecord::Base
  scope :mailed_counts_max_date, lambda {
    mailcounts.maximum(:maileddate)  
  }
end

次に、コントローラーで:

class BranchesController < ApplicationController
 def show
  @branch = Branch.find(params[:id])
  @territories = @branch.territories

  respond_to do |format|
    format.html
    format.xls { 
      send_data @territories.to_xls(:columns => [ { :branch => :name }, :zip, :mailed_counts_max_date ] )
    }
 end
end
于 2012-06-20T03:57:42.253 に答える
1

試しましたか(まったくテストされていません)

format.xls {
  # essentially replicate what the view does
  arr = []
  for territory in @territories
    arr << [territory.branch.name, territory.zip,  territory.mailedcounts.maximum(:maileddate)] 
  end
  send_data arr.to_xls
}

それ(宝石?)が配列のリストを期待している場合、ActiveRecordの使用について神聖なことは何もありません...

于 2012-06-20T04:03:19.140 に答える