Rails 5 CSV合并导出

时间:2018-04-02 17:26:55

标签: ruby csv ruby-on-rails-5

我正在尝试从我的rails应用中的表中导出CSV文件。我可以导出booking.attributes.values,我可以单独导出booking.user.attributes.values但是当我尝试合并这两个时,我收到一个错误。

“没有将Array隐式转换为Hash”

这是我正在使用的代码,包括一些注释代码。但是,csv文件只会引入booking.attributes的标题。这是我需要弄清楚的额外内容。

预订模式

    def self.to_csv(options = {})
#       desired_columns = ["fname","lname","email","nationality","date_of_birth","phone_number"]
        CSV.generate(options) do |csv|
            csv << column_names
            all.each do |booking|
#               csv << booking.user.attributes.merge(booking.course.attributes).values_at(*desired_columns)
#               csv << booking.user.attributes.values
#               csv << booking.attributes.values
                csv << booking.attributes.merge(booking.user.attributes.values).values
            end
        end
end

预订控制器

   def index
        @bookings = Booking.all.paginate(page: params[:page], per_page: 20)

        # respond to look for html but also csv data and xls
        respond_to do |format|
        format.html
        format.csv { send_data @bookings.to_csv }
        format.xls 
        end
    end

以下是我尝试以CSV格式重新创建的表格视图。这按预期工作。

    <table class="table">
  <thead class="thead-dark">
    <tr>
      <th scope="col">Name</th>
      <th scope="col">Email</th>
      <th scope="col">Nationality</th>
      <th scope="col">D.O.B</th>
      <th scope="col">Phone Number</th>
      <th scope="col">Course Name</th>
      <th scope="col">Course Start</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody id="bookingTable">
    <% @bookings.each do | booking | %>
      <tr>
       <td scope="row"><%= booking.user.fname %> <%= booking.user.lname %></td>
        <td scope="row"><%= booking.user.email %></td>
        <td scope="row"><%= booking.user.nationality %></td>
        <td scope="row"><%= booking.user.date_of_birth&.strftime("%d/%m/%Y") %></td>
        <td scope="row"><%= booking.user.phone_number %></td>
        <td scope="row"><%= booking.course.title %></td>
        <td scope="row"><%= booking.schedule.start_date&.strftime("%d %B %Y") %></td>
        <td><%= link_to 'View User', user_path(booking.user), class: "btn btn-info" %></td>
      </tr>
    <% end %>
  </tbody>
</table>

任何方向都会受到赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

我认为您的问题是您的预订属性(哈希)与预订用户的属性不匹配。值(数组)

因此,如错误消息所示,计算机无法知道哪些值属于哪些键。

我的猜测是你打算写:

booking.attributes.merge(booking.user.attributes).values

做了写:

booking.attributes.merge(booking.user.attributes.values).values

无论如何,你合并的东西都需要钥匙!

答案 1 :(得分:1)

CSV期望数组作为一行,而你正在搞乱哈希:

#      ⇓      hash      ⇓       ⇓         hash        ⇓ array ⇓ array ⇓
csv << booking.attributes.merge(booking.user.attributes.values).values 

合并哈希值很危险,因为如果user具有与booking相同的键,则后者将被丢弃。你想要的只是添加两个值数组:

csv << (booking.attributes.values + booking.user.attributes.values)

或者,如果用户的字段要先行:

csv << (booking.user.attributes.values + booking.attributes.values)