在CSV导出中使用循环 - Ruby

问题描述:

我试图干起我的代码,并想知道如果很多人有CSV和Ruby的经验。在CSV导出中使用循环 - Ruby

我的代码如下。它的工作原理就是......太可怕了。

我想知道如果任何人有我如何能做到以下任何想法:

1 - 我怎么能使用一个循环,而不是明确的1..10,我已经做到了。我确实尝试了几种方法,但无法让他们使用CSV。 2 - 是否有更好的方式来做CSV的标题? 3 - 有关如何使CSV代码更好的其他想法?

我最初去这个

(1..10).each do |number| 
end 

然而,CSV系统不喜欢那一个!它认为我的结论是不正确的,但我不认为这是事实。

这是我的代码。如果你有任何明智的想法,你真棒!是的,我知道这很糟糕,只是想知道我该如何做得更好!

require 'csv' 

class CampagignsCsv 
    class << self 
    HEADERS = [ 
     'Job Title', 
     'Business Name', 
     'Business Contact Name', 
     'Location', 
     'Job Status', 
     'Created date', 
     'Last Modified date', 
     '# Positions', 
     'Description', 
     'Std/Prem', 
     'Referral code (To discuss)', 
     'Coupon code (To discuss)', 
     'Question1', 
     'Knockout?1', 
     'Correct Answer1', 
     'Question2', 
     'Knockout?2', 
     'Correct Answer2', 
     'Question3', 
     'Knockout?3', 
     'Correct Answer3', 
     'Question4', 
     'Knockout?4', 
     'Correct Answer4', 
     'Question5', 
     'Knockout?5', 
     'Correct Answer5', 
     'Question6', 
     'Knockout?6', 
     'Correct Answer6', 
     'Question7', 
     'Knockout?7', 
     'Correct Answer7', 
     'Question8', 
     'Knockout?8', 
     'Correct Answer8', 
     'Question9', 
     'Knockout?9', 
     'Correct Answer9', 
     'Question10', 
     'Knockout?10', 
     'Correct Answer10' 
    ].freeze 

    def report 
     puts 'campaigns_report.csv created in reporting_output folder' 
     CSV.open("reporting_output/campagins_report.csv", "wb") do |csv| 
     csv << HEADERS 
     Paddl::Models::Job.all.each do |job| 
      csv << [ 
      job.title, 
      job.employer.business_name, 
      job.employer.profile.full_name, 
      job.address, 
      job.status, 
      job.created_at, 
      job.updated_at, 
      job.num_of_positions, 
      job.description, 
      job.employer.account_type, 
      'null', 
      'null', 
      job.job_questions.map { |item| item[:question] }[1], 
      job.job_questions.map { |item| item[:knockout] }[1], 
      job.job_questions.map { |item| item[:correct_answer] }[1], 
      job.job_questions.map { |item| item[:question] }[2], 
      job.job_questions.map { |item| item[:knockout] }[2], 
      job.job_questions.map { |item| item[:correct_answer] }[2], 
      job.job_questions.map { |item| item[:question] }[3], 
      job.job_questions.map { |item| item[:knockout] }[3], 
      job.job_questions.map { |item| item[:correct_answer] }[3], 
      job.job_questions.map { |item| item[:question] }[4], 
      job.job_questions.map { |item| item[:knockout] }[4], 
      job.job_questions.map { |item| item[:correct_answer] }[4], 
      job.job_questions.map { |item| item[:question] }[5], 
      job.job_questions.map { |item| item[:knockout] }[5], 
      job.job_questions.map { |item| item[:correct_answer] }[5], 
      job.job_questions.map { |item| item[:question] }[6], 
      job.job_questions.map { |item| item[:knockout] }[6], 
      job.job_questions.map { |item| item[:correct_answer] }[6], 
      job.job_questions.map { |item| item[:question] }[7], 
      job.job_questions.map { |item| item[:knockout] }[7], 
      job.job_questions.map { |item| item[:correct_answer] }[7], 
      job.job_questions.map { |item| item[:question] }[8], 
      job.job_questions.map { |item| item[:knockout] }[8], 
      job.job_questions.map { |item| item[:correct_answer] }[8], 
      job.job_questions.map { |item| item[:question] }[9], 
      job.job_questions.map { |item| item[:knockout] }[9], 
      job.job_questions.map { |item| item[:correct_answer] }[9], 
      job.job_questions.map { |item| item[:question] }[10], 
      job.job_questions.map { |item| item[:knockout] }[10], 
      job.job_questions.map { |item| item[:correct_answer] }[10] 
      ] 
     end 
     end 
    end 
    end 
end 

这是怎么回事?

... 
job.employer.account_type, 
'null', 
'null', 
*1.upto(10).flat_map {|i| 
    jq = job.job_questions[i] 
    [jq[:question], jq[:knockout], jq[:correct_answer]] 
} 
... 
+0

聪明。把它放到一个数组中然后压平它:) –

这里是一个更好的组织事物的方法,再加上削减重复一路下滑:

require 'csv' 

class CampagignsCsv 
    HEADERS = [ 
    'Job Title', 
    'Business Name', 
    'Business Contact Name', 
    'Location', 
    'Job Status', 
    'Created date', 
    'Last Modified date', 
    '# Positions', 
    'Description', 
    'Std/Prem', 
    'Referral code (To discuss)', 
    'Coupon code (To discuss)' 
    ] + (1..10).flat_map do |n| 
    "Question#{n}", 
    "Knockout?#{n}", 
    "Correct Answer#{n}", 
    end 

    SECTIONS = [ 
    :question, 
    :knockout, 
    :correct_answer 
    ] 

    def self.report 
    puts 'campaigns_report.csv created in reporting_output folder' 

    CSV.open("reporting_output/campagins_report.csv", "wb") do |csv| 
     csv << HEADERS 

     Paddl::Models::Job.all.each do |job| 
     csv << [ 
      job.title, 
      job.employer.business_name, 
      job.employer.profile.full_name, 
      job.address, 
      job.status, 
      job.created_at, 
      job.updated_at, 
      job.num_of_positions, 
      job.description, 
      job.employer.account_type, 
      'null', 
      'null' 
     ] + SECTIONS.flat_map do |section| 
      (1..10).map do |n| 
      job.job_questions[section][n] 
      end 
     end 
     end 
    end 
    end 
end 

通常你在你们班的最高层声明常量,而不是一个class << self块内。这也没有必要,因为声明一个方法为self.x会自动使它成为一个类方法。

使用flat_map可以帮助将阵列阵列类型的结果转换为平面阵列,在这种情况下非常方便。

+0

'flat_map',呵呵,我记得你喜欢它吗? :)'(1..10).flat_map {| n |中有DRY候选者SECTIONS.map {| s | “#{s.gsub(/(? mudasobwa

+0

@mudasobwa从名称中获取标签是一个很好的计划,但使用Rails/ActiveSupport和'titleize'会更容易。 – tadman

+1

没有'rail'标签⇒没有'titleize' :( – mudasobwa