重构控制器动作代码DRY

时间:2016-07-10 11:22:13

标签: ruby-on-rails ruby refactoring

我正在使用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...

这是相当丑陋的,绝对不是一种铁路方式。我的意思是,控制器可以扩展到数百行。有没有办法将此代码放在循环中或以任何其他方式重构它?

3 个答案:

答案 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

希望有所帮助!