Skip to main content
4 of 7
edited title

Refactor to avoid cope repetition in loop with condition checking

I have snippet that really look ugly but I don't know how to refactor it:

if owner
  samples.each do |sample|        
    sample_name = get_name(sample) # logical to get correct name
    serialized_sample = SampleSerializer::Level10.new(sample, 10).serializable_hash
      groups[sample_name] = groups[sample_name] == nil 
                            ? [].push(serialized_sample)
                            : groups[sample_name].push(serialized_sample)
  end
else
  samples.each do |sample|        
    sample_name = get_name(sample) # logical to get correct name
    serialized_sample = ElementPermissionProxy.new(current_user, sample, user_ids).serialized
      groups[sample_name] = groups[sample_name] == nil 
                            ? [].push(serialized_sample)
                            : groups[sample_name].push(serialized_sample)
  end
end

As you can see the code block inside if .. else is mostly the same except I need to use 2 difference class on each case (SampleSerializer and ElementPermissionProxy).

I can change into:

samples.each do |sample|        
  sample_name = get_name(sample) # logical to get correct name
  serialized_sample = owner 
                      ? SampleSerializer::Level10.new(sample, 10).serializable_hash
                      : ElementPermissionProxy.new(current_user, sample, user_ids).serialized

  groups[sample_name] = groups[sample_name] == nil 
                        ? [].push(serialized_sample)
                        : groups[sample_name].push(serialized_sample)
end

However, the samples contains a few thousands of element, so that I have check the condition with every sample element. And I don't like this way of optimization.

In addition, I would really appreciate if someone help me with this block also:

  groups[sample_name] = groups[sample_name] == nil 
                        ? [].push(serialized_sample)
                        : groups[sample_name].push(serialized_sample)