使用acts_as_xlsx ruby​​ gem返回相关字段

时间:2013-09-27 15:08:59

标签: ruby-on-rails ruby ruby-on-rails-3.1

安装了gem acts_as_xlsx后,我无法看到如何返回活动记录中的相关字段。

class Ticket < ActiveRecord::Base
  acts_as_xlsx  :columns => [:customer_name ]
  attr_accessible :customer_id, :account_id, :first_weight, :ticket_no, :second_weight, :net_weight, :product_id, :vehicle_id, :customer_name, :vehicle_reg, :product_details, :weight


  belongs_to :customer
  belongs_to :vehicle
  belongs_to :product
  belongs_to :account

当使用tickets.xlsr生成文件时,我得到cutomer_id的结果,即30不是客户名称,而是如何返回名称?

控制器

def report
    @q = @gaurd.ticket.where("net_weight > 0").paginate(:page => params[:page], :per_page => 10).search(params[:q])
    @ticket = @q.result(distinct: true)
    respond_to do |format|
      format.html
      format.xlsx {
      xlsx_package = @ticket.to_xlsx
      begin 
        temp = Tempfile.new("report.xlsx") 
        xlsx_package.serialize temp.path
        send_data xlsx_package.to_stream.read, :filename => 'tickets.xlsx', :type=> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        ensure
        temp.close 
        temp.unlink
      end
      }
    end
  end

我一天中的大部分时间都在尝试,但是无法下载比customer_id等字段数据更多的内容,而不是相关的ticket.customer.name

2 个答案:

答案 0 :(得分:1)

我发现显示来自其他表的字段的技巧是指定列,然后指定您使用的列名:'external_table:field_name',例如:

send_data xlsx_package.to_stream.read, :filename => 'tickets.xlsx', 
  :type => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  :columns => [:id, :'customer.name', :account_id]

如果客户有时可用,则报告将失败。此问题的替代方法是创建一个引用customer.name的方法,并在不存在客户关系的情况下返回诸如“No customer”之类的值。

或者,您可以动态生成xlsx文件并指定其他逻辑。有关详细信息,请参阅文档。

答案 1 :(得分:-1)

这是导出XLS http://railscasts.com/episodes/362-exporting-csv-and-excel

的优秀轨道广播

怎么做。 在 config / application.rb

require 'csv'

视图中的

<%= link_to "Excel", model_path(format: "xls") %>

model_controller.rb

def index
  @products = Product.order(:name)
  respond_to do |format|
    format.html
    format.csv { send_data @products.to_csv }
    format.xls # { send_data @products.to_csv(col_sep: "\t") }
  end
end

models / model.rb

def self.to_csv(options = {})
  CSV.generate(options) do |csv|
    csv << column_names
    all.each do |product|
      csv << model.attributes.values_at(*column_names)
    end
  end
end

这是非常重要的

config / initializers / mime_types.rb

Mime::Type.register "application/xls", :xls

views / models / index.xls.erb

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="Sheet1">
    <Table>
      <Row>
        <Cell><Data ss:Type="String">ID</Data></Cell>
        <Cell><Data ss:Type="String">Name</Data></Cell>
        <Cell><Data ss:Type="String">Release Date</Data></Cell>
        <Cell><Data ss:Type="String">Price</Data></Cell>
      </Row>
    <% @models.each do |model| %>
      <Row>
        <Cell><Data ss:Type="Number"><%= model.id %></Data></Cell>
        <Cell><Data ss:Type="String"><%= model.name %></Data></Cell>
        <Cell><Data ss:Type="String"><%= model.released_on %></Data></Cell>
        <Cell><Data ss:Type="Number"><%= model.price %></Data></Cell>
      </Row>
    <% end %>
    </Table>
  </Worksheet>
</Workbook>

使用此功能,您可以轻松导出到XLS文件