Rails 并将控制台查询导出到 csv

Mar*_*ear 0 csv ruby-on-rails

我正在运行以下查询...

require 'csv'
require File.dirname(__FILE__) + '/config/environment.rb'

file = "#{Rails.root}/public/data.csv"
registrations = OnlineCourseRegistration.where(course_class_id: 681).where(status: "Completed").where("score >= ?", "80").where("exam_completed_at BETWEEN ? AND ?", 3.years.ago, Date.today)
 
CSV.open( file, 'w' ) do |writer|
  writer << registrations.first.attributes.map { |a,v| a }
  registrations.each do |s|
    if s.user_id
        writer << User.find(s.user_id).email
    end
    writer << s.attributes.map { |a,v| v }
  end
end
Run Code Online (Sandbox Code Playgroud)

这是失败 writer << User.find(s.user_id).email的错误:

`<<': undefined method `map' for "my_user@yahoo.com":String (NoMethodError)`
Run Code Online (Sandbox Code Playgroud)

基本上,我只想添加一个包含用户电子邮件地址的列。

更新

这是不带电子邮件字段的当前输出

id  cart_id user_id course_class_id created_at  updated_at  exam_attempts   exam_completed_at   evaluation_completed_at status  score   add_extension   retest_cart_id  retest_purchased_at
11990   10278   6073    681 2014-10-30 20:34:18 UTC 2014-12-17 14:48:39 UTC 2   2014-12-17 03:16:44 UTC 2014-12-17 14:48:39 UTC Completed   90  FALSE       
11931   10178   6023    681 2014-09-02 22:35:08 UTC 2015-02-24 03:58:03 UTC 1   2015-02-24 03:56:12 UTC 2015-02-24 03:58:03 UTC Completed   80  FALSE       
12015   10316   6089    681 2014-11-15 14:31:05 UTC 2014-11-18 20:14:13 UTC 1   2014-11-18 20:11:46 UTC 2014-11-18 20:14:13 UTC Completed   82  FALSE       
12044   10358   6103    681 2014-12-03 15:56:39 UTC 2014-12-06 23:05:18 UTC 2   2014-12-06 23:02:13 UTC 2014-12-06 23:05:18 UTC Completed   94  FALSE       
Run Code Online (Sandbox Code Playgroud)

所以我想在上面的每个列中附加一个电子邮件字段。

Mar*_*ear 5

这是相当贫民窟。但完全披露,这是客户要求的临时报告,它会做他们需要的事情。我只是连接[User.find(s.user_id).email]writer语句上。看起来简单地在它周围包裹括号就足以解决问题。这是完整的代码...

require 'csv'
require File.dirname(__FILE__) + '/config/environment.rb'

file = "#{Rails.root}/public/data.csv"

registrations = OnlineCourseRegistration.where(course_class_id: 681).where(status: "Completed").where("score >= ?", "80").where("exam_completed_at BETWEEN ? AND ?", 3.years.ago, Date.today)

CSV.open( file, 'w' ) do |writer|
  writer << registrations.first.attributes.map { |a,v| a }
  registrations.each do |s|

    writer << s.attributes.map { |a,v| v } + [User.find(s.user_id).email]
  end
end
Run Code Online (Sandbox Code Playgroud)