在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]]
}
...
答
这里是一个更好的组织事物的方法,再加上削减重复一路下滑:
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
可以帮助将阵列阵列类型的结果转换为平面阵列,在这种情况下非常方便。
聪明。把它放到一个数组中然后压平它:) –