2016-10-11 33 views
0

我試圖幹起我的代碼,並想知道如果很多人有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 

回答

1

這是怎麼回事?

... 
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

聰明。把它放到一個數組中然後壓平它:) –

1

這裏是一個更好的組織事物的方法,再加上削減重複一路下滑:

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(/(?<= \ A | _)\ w /,&:upcase).gsub('_','')}」}}'。 – mudasobwa

+0

@mudasobwa從名稱中獲取標籤是一個很好的計劃,但使用Rails/ActiveSupport和'titleize'會更容易。 – tadman

+1

沒有'rail'標籤⇒沒有'titleize' :( – mudasobwa