1

我有一个members设计如下的电子表格: 在此处输入图像描述

我的目标是上传一些列并排除其他列。name在这种情况下,我希望只上传ageemail并排除其他。我已经能够使用slice如下所示的方法来实现这一点:

def load_imported_members
    spreadsheet = open_spreadsheet
    spreadsheet.default_sheet = 'Worksheet'
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).map do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      member = Member.find_by_id(row["id"]) || Member.new
      member.attributes = row.to_hash.slice("id", "name", "age", "email")
      member
    end
  end

问题是last_row考虑到最后一行 (13) 之前的所有行,并且由于表单上有验证,因此由于空行(不应考虑)导致数据丢失而导致错误。有没有办法像我一样只上传特定的列,但仅限于有数据的行?

4

2 回答 2

0

谢谢这个问题。我从这个问题中学到了一些东西。

我已将您的答案列入候选名单 [注意:使用 'ROO' gem]

def load_imported_members(member)
  spreadsheet = open_spreadsheet(member)
  spreadsheet.each do |records|
  record = @spreadsheet ? Hash[[@header, @spreadsheet.row(records)].transpose] : Hash[records] # transpose for xlsx records and 
  attributes =  {id: record['id'], name: record['name'], email: record['email'], age: record['age']}
  member_object = Member.new(attributes)
  if member_object.valid?
    if Member.find(attributes[:id])
      Member.find(attributes[:id]).update(attributes)
    else
      member_object.save
    end
  end
 end
end

您可以使用Roo gem解析您上传的文件。

def self.open_spreadsheet(member)
case File.extname(member.file.original_filename)
when ".csv" then
  Roo::CSV.new(member.file.expiring_url, csv_options: {headers: true, skip_blanks: true, header_converters: ->(header) { header.strip }, converters: ->(data) { data ? data.strip : nil }})
when ".xlsx", ".xls" then
  @spreadsheet = Roo::Spreadsheet.open(member.file.expiring_url)
  @header = @spreadsheet.row(1)
  (2..@spreadsheet.last_row)
 end
end

这里我使用了s3上传的url,即expiring_url。希望这会有所帮助。我没有测试过。对不起,小错误。

如果您对姓名、电子邮件和年龄使用了验证。这肯定会帮助你..

于 2019-10-23T14:02:21.847 回答
0

您可能希望像此示例map一样链接过滤器的调用reject

您可能只需要将map行更改为此(假设缺少的行都与上面的行类似): (2..spreadsheet.last_row).reject{|i| spreadsheet.row(i)[0] }.map do |i|

这是假设空白行返回为 nil,并且空白行将始终使所有四个所需字段为空白,如图所示。reject调用测试以查看id列spreadsheet.row(i)[0]是否为 nil,如果是,则从给定的列表输出中拒绝该项目map

于 2019-10-27T18:36:33.540 回答