我有AR的对象数组 我想用极限来限制它们。
当前方法如下:
def rarefied_values(limit = 200)
all_values = self.values.all
rarefied_values = []
chunk_size = (all_values.size / limit.to_f).ceil
if all_values.size > limit
all_values.each_slice(chunk_size) do |chunk|
rarefied_values.push(chunk.first)
end
return rarefied_values
else
return all_values
end
end
重构的任何提示?
答案 0 :(得分:1)
def rarefied_values(limit = 200)
all_values = values.all
return all_values unless all_values.size > limit
chunk_size = all_values.size / limit
(0...limit).map{|i| all_values[i*chunk_size]}
end
ruby中重构的一些要点
self
通常可以省略。在少数情况下,您不能,例如self.class
。在这种情况下,self.values.all
=> values.all
return
将其从其余代码中删除。在这种情况下,return all_values unless all_values.size > limit
rarefied_values = []
,则不需要all_values.size > limit
。所以把它放在条件部分。答案 1 :(得分:0)
这是一个天真的重构,保持相同的方法,但删除显式的返回调用,只在必要时执行某些转换:
def rarefied_values(limit = 200)
all_values = self.values.all
if all_values.size <= limit
all_values
else
chunk_size = (all_values.size / limit.to_f).ceil
[].tap{ |rare| all_values.each_slice(chunk_size){ |c| rare << c.first } }
end
end
这是一个更快,更简洁的版本:
def rarefied_values(limit = 200)
all_values = self.values.all
if (size = all_values.size) <= limit
all_values
else
all_values.values_at(*0.step(size-1,(size.to_f/limit).ceil))
end
end