我正在尝试从我的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>
任何方向都会受到赞赏。谢谢。
答案 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)