导轨5 – 导出到XL / CSV,但通过关联

我一直在CSV / Excel Export上关注这个Railscast ,但是我在关联逻辑上遇到了一些问题。

CSV混淆/问题

在我的Collection Model我有

 class Collection < ApplicationRecord belongs_to :user has_many :card_collections has_many :cards, through: :card_collections def self.to_csv attributes = %w{name} CSV.generate(headers: true) do |csv| csv << attributes all.each do |collection| csv << attributes.map{ |attr| collection.send(attr) } end end end # validates :user_id, presence: true end 

CSV导出

 name Demo 2 HEHHEHEEHHE 

名字是列名Demo 2是第一个集合HEHHEHEEHHE是第二个集合

我需要更多的信息,但是一旦我得到“一个”参数,我就可以从那里开始。 但是,这是行不通的.'name'将返回所有集合的名称,这是不是我想要的,但我也试图获得集合中的'卡'信息(引用cards_collection )给你一个例子 – 在控制台,我会input: c = Collection.last c.cards.first.name ,我会得到第一个名片。 我不确定是否应该在Card_collections控制器, Cards控制器或者什么的情况下使用self.to_csv函数。 我通过关联发现了许多关于CSV的类似问题,但没有任何一个方法让我find解决scheme

Excel混乱

 <?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="Card Collection"> <Table> <Row> <Cell><Data ss:Type="String">Name</Data></Cell> <Cell><Data ss:Type="String">Text</Data></Cell> <Cell><Data ss:Type="String">Set</Data></Cell> </Row> <% @collection.card_collections.each do |collection| %> <Row> <Cell><Data ss:Type="String"><%= collection.card.name %></Data></Cell> <Cell><Data ss:Type="String"><%= collection.card.text %></Data></Cell> <Cell><Data ss:Type="String"><%= collection.card.set %></Data></Cell> </Row> <% end %> </Table> </Worksheet> </Workbook> 

是一个示例脚本 – 我实际上已经包裹在“每个”中,因为如果他们selectExcel,我将允许他们为每个“集合”获取一张纸。

为了给你一个关系的想法,我的Collection View看起来像 –

 <p id="notice"><%= notice %></p> <div class="center"><%= @collection.name %></div><br /> <div class="center">Made By: <strong> <% if @collection.public %> <%= link_to @collection.user.name, {:controller => "users", :action => "show", :id => @collection.user.id} %><br /> <% else %> Anonymous<br /> <% end %> </strong> Total Cards: <%= @collection.card_collections.sum(:card_counts) %> Distinct Cards: <%= @collection.card_collections.count %> <br /> </div> <% @collection.card_collections.in_groups_of(3, false).each do |group| %> <div class='row'> <% group.each do |card| %> <div class='col-sm-6 col-md-4'> <%= image_tag(card.card.image_url, class: "img-responsive") %> <h3> <%= link_to card.card.name, {:controller => "cards", :action => "show", :id => card.card.id }%> </h3> <div><%= card_text_swap(card.card.text) %></div> <div><span class='cardLabel'>Set</span>: <i class="ss ss-<%= card.card.set.downcase %> ss-3x ss-<%= card.card.rarity.downcase %>"></i> <span class="setName"><%= card.card.setName %></span> </div> <div>Total in Collection: <%= card.card_counts %></div> </div> <% end %> </div> <% end %> <%= link_to 'Edit', edit_collection_path(@collection) %> | <%= link_to 'Back', collections_path %> 

我努力在最初的视图,但最终得到它的工作,我想在Excel导出使用相同的逻辑,但它不能正确呈现。 (立即没有错误,所以我认为这可能是我的失败。)

附加信息所有这些都存储在ActiveDirectory中,并呈现为当前的视图。 不确定我应该提供哪些其他信息。

新的Excel问题

Collections_Controller

  def show @collection = Collection.find(params[:id]) respond_to do |format| format.html format.csv { render text: @collection.to_csv } format.xls { send_data @collection.to_csv(col_sep: "\t") } end end 

视图

  <%= link_to "CSV", collection_path(format: "csv") %> | <%= link_to "Excel", collection_path(format: "xls") %> 

CSV现在正在工作 – Excel不是。

提供的错误:

 ArgumentError in CollectionsController#show wrong number of arguments (given 1, expected 0) 

“def self.to_csv”定义了一个类方法。 如果你想列出给定集合的卡片,你需要定义和调用(在你的集合控制器的show方法中)一个实例方法。

所以我改变你的to_csv在以下的方式:

 def to_csv attributes = %w{name} CSV.generate(headers: true) do |csv| csv << attributes cards.each do |card| csv << attributes.map{ |attr| card.send(attr) } end end end 

这是如何在您的控制器中调用to_csv:

 class CollectionsController < ApplicationController def show @collection = Collection.find(params[:id]) respond_to do |format| format.html format.csv { render text: @collection.to_csv } end end end 

对于Excel:

 <?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="Card Collection"> <Table> <Row> <Cell><Data ss:Type="String">Name</Data></Cell> <Cell><Data ss:Type="String">Text</Data></Cell> <Cell><Data ss:Type="String">Set</Data></Cell> </Row> <% @collection.cards.each do |card| %> <Row> <Cell><Data ss:Type="String"><%= card.name %></Data></Cell> <Cell><Data ss:Type="String"><%= card.text %></Data></Cell> <Cell><Data ss:Type="String"><%= card.set %></Data></Cell> </Row> <% end %> </Table> </Worksheet> </Workbook> 

一般来说,当你想要访问指定@collection的卡片时,只需使用cards关系,当访问指定卡片的属性时,不需要额外的.card