在Rails 3.2中调用一个数组的ActiveRecord关联方法

目标:使用与我的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 

分行有许多地区。 一个地区有许多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这两个工作正常。 从领土出发,我无法弄清楚如何得到我的邮政编码信息。

使用自定义范围应该为此工作。

 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 

你有没有尝试过(完全未经testing)

 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没有任何神圣的事情…

这是为我做的解决scheme。 (经过了更多的时间,比应该采取的)

诀窍是在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 

我无法获得在领土模型中工作的范围或方法,而没有实质上重现与另一个连接的关系。