我正在使用indeed_api从Indeed API中检索作业,但是因为每次查询只允许25个结果,所以我在我的控制器中提出了这个代码来获取所有作业并将它们全部列在一个页面上:
@jobs = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", limit: "25")
@results = @jobs.results
if @jobs.total_results > 25
@jobs2 = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", start: "25", limit: "25")
@results += @jobs2.results
end
if @jobs.total_results > 50
@jobs3 = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", start: "50", limit: "25")
@results += @jobs3.results
end
if @jobs.total_results > 75
@jobs4 = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", start: "75", limit: "25")
@results += @jobs4.results
#and so on...
这是相当丑陋的,绝对不是一种铁路方式。我的意思是,控制器可以扩展到数百行。有没有办法将此代码放在循环中或以任何其他方式重构它?
答案 0 :(得分:0)
我认为你应该将它从控制器中移出来,使用sidekiq
等后台作业将其转移到某项服务是一种很好的做法。
如果你想要一个循环:
batches = @jobs.total_results / 25
@results = []
(0..batches).do |batch|
@results << IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", start: (batch * 25).to_s, limit: "25")
end
答案 1 :(得分:0)
我会做这样的事情:
query = { co: 'au', l: 'sydney', radius: 100 }
total = IndeedAPI.search_jobs(query).total_results
per_page = 25
pages = (total.to_f / per_page).ceil
@results = pages.times.flat_map do |page|
IndeedAPI.search_jobs(
query.merge(sort: 'date', start: per_page * page, limit: per_page
).results
end
答案 2 :(得分:0)
您可以执行以下操作:
@jobs = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", limit: "25")
@results = @jobs.results
total_results = @jobs.total_results
if total_results.size > 25
25.step(total_results, 25) do |step|
r = IndeedAPI.search_jobs(co: "au", l: "sydney", radius: "100", sort: "date", limit: "25", start: step)
@results = @results.concat(r)
end
end
解决方案有点脏,但我认为你可以稍微重构一下。基本上,魔术在step
方法中,它使用从total_results
开始的数字序列调用块,每次调用时增加25。您可以详细了解Numeric#step
here。
希望有所帮助!