目标:使用与我的HTML表格中类似的3个关联模型的信息生成Excel文档。 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
分行有许多地区。 领土有许多邮寄帐户。
我可以通过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信息。
答案 0 :(得分: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
答案 1 :(得分: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
}
如果它(gem?)需要一个数组列表,那么使用ActiveRecord就没什么神圣之处......
答案 2 :(得分: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模型中使用范围或方法,而基本上不会再现与其他连接的关系。