2012-03-02 59 views
1
@release = Release.find(params[:id]) 
@[email protected]  
@release_cycles=Cycle.find_by_sql("select * from cycles where release_id=#{params[:id]}") 
current_page=params[:page]?Integer(params[:page]):1 
@release_cycles = @release_cycles.paginate(:page=>params[:page],:per_page=>5) 
[email protected] 
puts "params[releases==]==#{params[:releases]}" 

releases=params[:releases].to_i 
release1=(releases>0)?Release.find(params[:releases]):nil 
puts "release1==#{release1}" 

@non_ics=(release1!=nil)?(release1.ics):Ic.active 

@non_members=[] 

@non_ics.each do |non_ic| 
    check=1 
    release_ics.each do |release_ic| 
    if non_ic==release_ic 
     check=0 
     puts "inside ics comparison if" 
    end 
    end 
    if check==1 
    puts "inside if ! in release_only" 
    @non_members << non_ic 
    puts "@ics==#{@non_members}" 
    end 
end 

...嵌套循环在控制器红宝石优化

respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @release } 
    end 
end 

的代码在结束注释的块是吃了运行时如狂(约需20-30秒加载)我我想我如何优化这个想法,但我想第三个人想到如何优化代码,使其更快地运行

+0

这是一个非常长的例子。有没有什么方法可以将此重构为一个最小的失败示例,它仍然说明了相同的行为? – 2012-03-02 03:23:56

+0

它实际上是缓慢的块还是块建立了后来传递给搜索函数的@ non_members数组(可能因索引缺失而变慢)? '@ non_ics'和'release_ics'有多大,你能基准测试这个循环需要多长时间吗? (即使只是't0 = Time.now'在顶部,'puts'#{Time.now - t0} s“'在这个块的底部就足够了) – 2012-03-02 03:57:41

回答

1

您的整个代码的第一部分可以替换为4行代码:

@release = Release.find(params[:id]) 
@release_cycles = @release.cycles.paginate(:page=> params[:page].presence || 1, 
    :per_page=>5) 
@non_ics= params[:releases].present? ? Release.find(params[:releases]).ics : 
    Ic.active 
@non_members = @non_ics - @release.ics 

除了可以改进的代码之外,您还将所有发行版加载到内存中,并在ruby内存空间中对结果集进行分页。如果每次发布都有大量循环,这会降低您的流程。

我使用Ruby计算了最后一行中两个数组之间的交集。如果数组大小很大,我会使用SQL。

+0

所以一种方法是替换嵌套代码与SQL调用并比较它在数据库中? – lifejuggler 2012-03-02 12:56:16

+0

当我尝试使用你的代码时,我也会得到一个无ID的版本,你知道为什么吗? – lifejuggler 2012-03-02 14:19:37

+0

如果缺少'params [:id]'或者'params [:releases]'的值被设置为无效的'id',你会得到一个错误。这两种情况都是严重错误,应通过修复您的请求参数来解决。 – 2012-03-02 18:53:03