Daily Refactor #58: Move Method to Query Model

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
1
2
3
4
# 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
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

Review

Even though this refactoring is simple, it’s useful for three reasons:

  1. It reduces the complexity of the Controller
  2. It removes some duplication in the Controller
  3. It makes a new method available on the Model that can be reused in other places

Reference commit

Share

  • Facebook
  • Twitter
  • HackerNews
  • Reddit
  • Tumblr
  • Delicious
  • Email
  • RSS

Related posts:

  1. Daily Refactor #81: Move last_invoice_number to Model
  2. Daily Refactor #54: Move Method to KanbanPane
  3. Daily Refactor #31: Extract Method in IssuesHelper#show_detail
  4. Daily Refactor #30: Move Method into Issue
  5. Daily Refactor #8: Move method in the ReportsController

About Eric Davis

I founded Little Stream Software where I provide Redmine and ChiliProject services to help projects teams. I also created an ebook, Redmine Tips, were I show you how to become more productive using Redmine. I am also the author of Refactoring Redmine, where I go about refactoring Rails using Redmine as an example.

, , ,

Chirk HR     Reuse your existing job applicants »
WP Socializer Aakash Web