Skip to content

Commit 41b49f4

Browse files
committed
Replace Subclasses with Strategies: Step Ten
* Move state for first strategy out of root class
1 parent ecc8e7b commit 41b49f4

17 files changed

Lines changed: 132 additions & 46 deletions

‎example_app/app/controllers/questions_controller.rb‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def update
3232

3333
def build_question
3434
@question = type.constantize.new(question_params)
35-
@question.build_submittable({})
35+
@question.build_submittable(submittable_params)
3636
@question.survey = @survey
3737
end
3838

@@ -43,6 +43,14 @@ def type
4343
def question_params
4444
params.
4545
require(:question).
46-
permit(:title, :options_attributes, :minimum, :maximum)
46+
permit(:title, :options_attributes)
47+
end
48+
49+
def submittable_params
50+
if submittable_attributes = params[:question][:submittable_attributes]
51+
submittable_attributes.permit(:minimum, :maximum)
52+
else
53+
{}
54+
end
4755
end
4856
end

‎example_app/app/controllers/types_controller.rb‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ def new
33
@question = Question.find(params[:question_id])
44
assign_type
55
@new_question = type.constantize.new
6+
@new_question.build_submittable({})
67
end
78

89
def create
910
@question = Question.find(params[:question_id])
10-
@new_question = @question.switch_to(type, params[:question], {})
11+
@new_question = @question.switch_to(
12+
type,
13+
question_params,
14+
submittable_attributes
15+
)
1116

1217
if @new_question.errors.empty?
1318
redirect_to @question.survey
@@ -23,6 +28,14 @@ def assign_type
2328
@new_type = type.underscore
2429
end
2530

31+
def question_params
32+
params[:question].except(:submittable_attributes)
33+
end
34+
35+
def submittable_attributes
36+
params[:question][:submittable_attributes] || {}
37+
end
38+
2639
def type
2740
params[:question][:type]
2841
end

‎example_app/app/models/question.rb‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ class Question < ActiveRecord::Base
33

44
QUESTION_TYPES = %w(OpenQuestion MultipleChoiceQuestion ScaleQuestion).freeze
55

6+
validates :submittable, associated: true
67
validates :type, presence: true, inclusion: QUESTION_TYPES
78
validates :title, presence: true
89

910
belongs_to :submittable, polymorphic: true
1011
belongs_to :survey
1112
has_many :answers
1213

14+
accepts_nested_attributes_for :submittable
15+
1316
delegate :breakdown, :score, to: :submittable
1417
delegate :title, to: :survey, prefix: true
1518

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
class ScaleQuestion < Question
2-
validates :maximum, presence: true
3-
validates :minimum, presence: true
42
end

‎example_app/app/models/scale_submittable.rb‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
class ScaleSubmittable < ActiveRecord::Base
22
has_one :question, as: :submittable
33

4+
validates :maximum, presence: true
5+
validates :minimum, presence: true
6+
47
def breakdown
58
sprintf('Average: %.02f', answers.average('text'))
69
end
@@ -10,7 +13,7 @@ def score(text)
1013
end
1114

1215
def steps
13-
(question.minimum..question.maximum).to_a
16+
(minimum..maximum).to_a
1417
end
1518

1619
private
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
<%= form.input :minimum %>
2-
<%= form.input :maximum %>
1+
<%= form.fields_for :submittable do |submittable_fields| -%>
2+
<%= submittable_fields.input :minimum %>
3+
<%= submittable_fields.input :maximum %>
4+
<% end -%>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class MoveScaleQuestionStateToScaleSubmittable < ActiveRecord::Migration
2+
def up
3+
add_column :scale_submittables, :minimum, :integer
4+
add_column :scale_submittables, :maximum, :integer
5+
6+
connection.insert(<<-SQL)
7+
INSERT INTO scale_submittables
8+
(id, created_at, updated_at, minimum, maximum)
9+
SELECT
10+
id, created_at, updated_at, minimum, maximum
11+
FROM questions
12+
WHERE questions.type = 'ScaleQuestion'
13+
SQL
14+
15+
connection.update(<<-SQL)
16+
UPDATE questions
17+
SET submittable_id = id, submittable_type = 'ScaleSubmittable'
18+
WHERE type = 'ScaleQuestion'
19+
SQL
20+
21+
remove_column :questions, :minimum
22+
remove_column :questions, :maximum
23+
end
24+
25+
def down
26+
add_column :questions, :maximum, :integer
27+
add_column :questions, :minimum, :integer
28+
29+
connection.update(<<-SQL)
30+
UPDATE questions
31+
SET
32+
minimum = (
33+
SELECT minimum
34+
FROM scale_submittables
35+
WHERE questions.submittable_id = scale_submittables.id
36+
),
37+
maximum = (
38+
SELECT maximum
39+
FROM scale_submittables
40+
WHERE questions.submittable_id = scale_submittables.id
41+
)
42+
WHERE questions.submittable_type = 'ScaleSubmittable'
43+
SQL
44+
45+
connection.delete('DELETE FROM scale_submittables')
46+
47+
remove_column :scale_submittables, :maximum
48+
remove_column :scale_submittables, :minimum
49+
end
50+
end

‎example_app/db/schema.rb‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# It's strongly recommended to check this file into your version control system.
1313

14-
ActiveRecord::Schema.define(:version => 20130131205918) do
14+
ActiveRecord::Schema.define(:version => 20130131211856) do
1515

1616
create_table "answers", :force => true do |t|
1717
t.integer "completion_id", :null => false
@@ -72,15 +72,15 @@
7272
t.integer "survey_id", :null => false
7373
t.datetime "created_at", :null => false
7474
t.datetime "updated_at", :null => false
75-
t.integer "minimum"
76-
t.integer "maximum"
7775
t.integer "submittable_id"
7876
t.string "submittable_type"
7977
end
8078

8179
create_table "scale_submittables", :force => true do |t|
8280
t.datetime "created_at", :null => false
8381
t.datetime "updated_at", :null => false
82+
t.integer "minimum"
83+
t.integer "maximum"
8484
end
8585

8686
create_table "surveys", :force => true do |t|

‎example_app/spec/factories/application.rb‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,13 @@
4343
end
4444

4545
factory :scale_question, class: 'ScaleQuestion' do
46-
minimum 1
47-
maximum 2
48-
4946
submittable factory: :scale_submittable
5047
end
5148
end
5249

5350
factory :scale_submittable do
51+
minimum 1
52+
maximum 2
5453
end
5554

5655
factory :survey do

‎example_app/spec/features/user_answers_scale_question_spec.rb‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
feature 'user answers scale question' do
44
scenario 'with valid answer' do
55
sign_in
6-
view_survey_with_question :scale,
7-
title: 'How many fingers do you have?',
8-
minimum: 0,
9-
maximum: 10
6+
view_survey_with_question(
7+
:scale,
8+
{ title: 'How many fingers do you have?' },
9+
{ minimum: 0, maximum: 10 }
10+
)
1011
choose '10'
1112
submit_answers
1213
answer_to_question('How many fingers do you have?').

0 commit comments

Comments
 (0)