2016-10-11 2 views
0

私は自分のコードを枯らして、多くの人がCSVやRubyの経験があるかどうか疑問に思っています。CSV書き出し内でループを使用する - Ruby

私のコードは以下の通りです。それはちょうど...ひどい。

誰もが、私は次の操作を行うことができる方法上の任意のアイデアを持っている場合、私は思ったんだけど:

1 - どのように私は私がやったループではなく、明示的な1..10を使用することができます。私はいくつかの方法を試しましたが、CSVで動作させることができませんでした。 2 - CSVでヘッダーを行う方法はありますか? 3 - CSVコードをうまく作成する方法に関する他のアイデアはありますか?

CSVシステムは、そのいずれかを好きではなかったしかし、私は最初にこの

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

と一緒に行きました!私の最後のステートメントは間違っていると思っていたが、私はこれが当てはまるとは思わない。

ここに私のコードです。明るいアイデアがあれば、あなたは素晴らしいです!はい、私はそれがひどいことを知っている、ちょうど私がそれをより良くすることができると思う!

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'、ハァッ、私はそれが好きですか? :) DRY候補が '(1..10).flat_map {| n | SECTIONS.map {| s | "#{s.gsub(/(?<= \ A | _)\ w /、&:upcase).gsub( '_'、 ''}}"}} ' – mudasobwa

+0

@mudasobwa名前からラベルを派生させるのは良い計画ですが、Rails/ActiveSupportと 'titleize'ではかなり簡単です。 – tadman

+1

いいえ 'rails'タグなし⇒いいえ' titleize' :( – mudasobwa

関連する問題