2

目标:生成一个 Excel 文档,其中包含来自 3 个相关模型的信息,类似于我的 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

这给了我可以正常工作的区域.branch.name 和区域.zip。从领土开始,我不知道如何获取我的邮件计数信息。

4

3 回答 3

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 回答
1

这是为我做的解决方案。(经过比应有的时间多得多的尝试。)

诀窍是在 Mailedcount 模型中定义一个类,而不是在 Territory 模型中。

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 回答