The Refactoring
Using move method I was able to move a chunk of duplicated code from the QueriesController into the Query model.
Before
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 | # app/controllers/queries_controller.rb
  def new
    # ...
    params[:fields].each do |field|
      @query.add_filter(field, params[:operators][field], params[:values][field])
    end if params[:fields]
    @query.group_by ||= params[:group_by]
    # ...
  end
 
  def edit
      # ...
      params[:fields].each do |field|
        @query.add_filter(field, params[:operators][field], params[:values][field])
      end if params[:fields]
      @query.attributes = params[:query]
      # ...
  end | 
# app/controllers/queries_controller.rb
  def new
    # ...
    params[:fields].each do |field|
      @query.add_filter(field, params[:operators][field], params[:values][field])
    end if params[:fields]
    @query.group_by ||= params[:group_by]
    # ...
  end
  
  def edit
      # ...
      params[:fields].each do |field|
        @query.add_filter(field, params[:operators][field], params[:values][field])
      end if params[:fields]
      @query.attributes = params[:query]
      # ...
  end
 
| 1
2
3
4
 | # app/models/query.rb
class Query < ActiveRecord::Base
  # ...
end | 
# app/models/query.rb
class Query < ActiveRecord::Base
  # ...
end
 
After
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 | # app/controllers/queries_controller.rb
class QueriesController < ApplicationController
  def new
    # ...
    @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
    @query.group_by ||= params[:group_by]
    # ...
  end
 
  def edit
      # ...
      @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
      @query.attributes = params[:query]
      # ...
  end
end | 
# app/controllers/queries_controller.rb
class QueriesController < ApplicationController
  def new
    # ...
    @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
    @query.group_by ||= params[:group_by]
    # ...
  end
  
  def edit
      # ...
      @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
      @query.attributes = params[:query]
      # ...
  end
end
 
| 1
2
3
4
5
6
7
8
 | class Query < ActiveRecord::Base
  # Add multiple filters using +add_filter+
  def add_filters(fields, operators, values)
    fields.each do |field|
      add_filter(field, operators[field], values[field])
    end
  end
end | 
class Query < ActiveRecord::Base
  # Add multiple filters using +add_filter+
  def add_filters(fields, operators, values)
    fields.each do |field|
      add_filter(field, operators[field], values[field])
    end
  end
end
 
Review
Even though this refactoring is simple, it’s useful for three reasons:
- It reduces the complexity of the Controller
- It removes some duplication in the Controller
- It makes a new method available on the Model that can be reused in other places
Reference commit