Rails 使用主动存储读取 csv 文件数据
Posted
技术标签:
【中文标题】Rails 使用主动存储读取 csv 文件数据【英文标题】:Rails Read csv file data with active storage 【发布时间】:2018-07-22 19:37:00 【问题描述】:我有这门课,我正在使用主动存储
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
【问题讨论】:
【参考方案1】:使用download
获取文件内容:
CSV.parse(materials_upload.csv_file.download, headers: true) do |row|
# ...
end
【讨论】:
感谢 a 正在寻找的东西!! @george-claghorn 我需要使用CSV.foreach
而不是CSV.parse
(因为文件中的行太多)和file.download
似乎使用了太多内存。如何获得所需的文件路径? (我使用的是亚马逊 S3)【参考方案2】:
我认为这可能是另一种选择(当它在磁盘上本地时)。我使用了来自this答案的代码
file_path = ActiveStorage::Blob.service.send(:path_for, materials_upload.csv_file.key)
CSV.foreach file_path, headers: true do
# ...
end
【讨论】:
【参考方案3】:上传后,您可以使用CSV::Table lib 将 CSV 文件读入 html 表格:
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>
【讨论】:
这里的问题是我无法从活动存储中获取文件以上是关于Rails 使用主动存储读取 csv 文件数据的主要内容,如果未能解决你的问题,请参考以下文章
Rails 6主动存储sidekiq文件在S3上上传背景图片