Rails 使用活动存储读取 csv 文件数据
Rails Read csv file data with active storage
我有这个 class 并且我正在使用活动存储
class MaterialsUpload < ApplicationRecord
has_one_attached :csv_file
end
这是附件
#<ActiveStorage::Attached::One:0x007ff1f0be9e90
@dependent=:purge_later,
@name="csv_file",
@record=
#<MaterialsUpload:0x007ff1f0c604f0
id: 3,
success: 0,
errors_list: [],
total: 0,
created_at: Mon, 12 Feb 2018 14:43:35 UTC +00:00,
updated_at: Mon, 12 Feb 2018 14:43:35 UTC +00:00>>
有什么方法可以让我读取数据,这样我就可以做这样的事情
string = materials_upload.csv_file.read
CSV.parse(csv_string, headers: true) do |row|
# do something
end
上传后,您可以使用 CSV::Table 库将 CSV 文件读入 HTML table:
def show
@csv_data = CSV.open('uploaded_file.csv', headers: true).read
end
视图示例:
<table cellspacing="5" cellpadding="5" border="0" >
<tr>
<% @csv_data.headers.each do |header| %>
<th><%= header %></th>
<% end %>
</tr>
<% @csv_data.each do |row| %>
<tr>
<% row.each do |value| %>
<td><%= value[1] %></td>
<% end %>
</tr>
<% end %>
</table>
使用download
获取文件内容:
CSV.parse(materials_upload.csv_file.download, headers: true) do |row|
# ...
end
我认为这可能是另一种选择(当它在本地磁盘上时)。我使用了 answer
中的代码
file_path = ActiveStorage::Blob.service.send(:path_for, materials_upload.csv_file.key)
CSV.foreach file_path, headers: true do
# ...
end
我有这个 class 并且我正在使用活动存储
class MaterialsUpload < ApplicationRecord
has_one_attached :csv_file
end
这是附件
#<ActiveStorage::Attached::One:0x007ff1f0be9e90
@dependent=:purge_later,
@name="csv_file",
@record=
#<MaterialsUpload:0x007ff1f0c604f0
id: 3,
success: 0,
errors_list: [],
total: 0,
created_at: Mon, 12 Feb 2018 14:43:35 UTC +00:00,
updated_at: Mon, 12 Feb 2018 14:43:35 UTC +00:00>>
有什么方法可以让我读取数据,这样我就可以做这样的事情
string = materials_upload.csv_file.read
CSV.parse(csv_string, headers: true) do |row|
# do something
end
上传后,您可以使用 CSV::Table 库将 CSV 文件读入 HTML table:
def show
@csv_data = CSV.open('uploaded_file.csv', headers: true).read
end
视图示例:
<table cellspacing="5" cellpadding="5" border="0" >
<tr>
<% @csv_data.headers.each do |header| %>
<th><%= header %></th>
<% end %>
</tr>
<% @csv_data.each do |row| %>
<tr>
<% row.each do |value| %>
<td><%= value[1] %></td>
<% end %>
</tr>
<% end %>
</table>
使用download
获取文件内容:
CSV.parse(materials_upload.csv_file.download, headers: true) do |row|
# ...
end
我认为这可能是另一种选择(当它在本地磁盘上时)。我使用了
file_path = ActiveStorage::Blob.service.send(:path_for, materials_upload.csv_file.key)
CSV.foreach file_path, headers: true do
# ...
end