连接CSV的数组和字符串

时间:2014-12-19 13:47:17

标签: ruby arrays string concatenation

我正在尝试将字符串连接到数组值。由于URL /域相同,我只是存储用户的电子邮件前缀并附加url / domain。我需要将完整的电子邮件地址导出为CSV:

 CSV.generate(options) do |csv|
    columns = %w(name, email_address) 
    url = "@example.com"   
    all.each do |location|
      csv << location.attributes.values_at(*columns) + [url]     
    end
  end

目前产生的结果是:

Joe, user1, @example.com
Bob, user2, @example.com

我需要的是:

Joe, user1@example.com
Bob, user2@example.com

我如何实现上述目标?

2 个答案:

答案 0 :(得分:1)

location是一个模型对象,对吧?

CSV.generate(options) do |csv|
  domain = "example.com"

  all.each do |location|    
    csv << [location.name, "#{location.email_address}@#{domain}"]
  end
end

更新

IMO也更清洁。但是如果你想保留你的版本,那么我建议你在full_email_address模型中创建一个Location方法,返回类似username@domain.com的内容。

然后,您可以稍后更改列数据并轻松修改CSV输出。像这样:

class Location << ActiveRecord::Base
  def full_email_address
    return "" if self.email_address.blank?

    domain = "example.com" # or save this as a constant in the class
    "#{self.email_address}@#{domain}"
  end
end

CSV.generate(options) do |csv|
  columns = %w{name full_email_address} # add other methods or attributes here

  all.each do |location|
    csv << columns.map{ |moa| location.public_send(moa) }
  end
end

答案 1 :(得分:0)

试试这个:

CSV.generate(options) do |csv|
  columns = %w(name, email_address) 
  url = "@example.com"   
  all.each do |location|
    row = location.attributes.values_at(*columns)
    row[-1] = row[-1] + url
    csv << row
  end
end

目前写入CSV的数组是['Joe', 'user1'] + ['@example.com'],因此我没有将url添加到属性数组中,而是将其添加到最后一个属性中。