Skip to content

Commit e4809cd

Browse files
committed
Replace Subclasses with Strategies: Step Seven
* Convert strategies to ActiveRecord subclasses * Create empty tables for strategies
1 parent 7507598 commit e4809cd

12 files changed

+76
-31
lines changed

example_app/app/models/multiple_choice_submittable.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
class MultipleChoiceSubmittable
2-
def initialize(question)
3-
@question = question
4-
end
1+
class MultipleChoiceSubmittable < ActiveRecord::Base
2+
has_one :question, as: :submittable
53

64
def breakdown
75
total = answers.count
@@ -28,10 +26,10 @@ def score(text)
2826
private
2927

3028
def answers
31-
@question.answers
29+
question.answers
3230
end
3331

3432
def options
35-
@question.options
33+
question.options
3634
end
3735
end

example_app/app/models/open_submittable.rb

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
class OpenSubmittable
2-
def initialize(question)
3-
@question = question
4-
end
1+
class OpenSubmittable < ActiveRecord::Base
2+
has_one :question, as: :submittable
53

64
def breakdown
75
text_from_ordered_answers = answers.order(:created_at).pluck(:text)
@@ -15,6 +13,6 @@ def score(text)
1513
private
1614

1715
def answers
18-
@question.answers
16+
question.answers
1917
end
2018
end

example_app/app/models/question.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ def most_recent_answer_text
1717
end
1818

1919
def submittable
20-
submittable_class_name = type.sub('Question', 'Submittable')
21-
submittable_class_name.constantize.new(self)
20+
submittable_class = type.sub('Question', 'Submittable').constantize
21+
submittable_class.new(question: self)
2222
end
2323

2424
def summarize(summarizer)
@@ -28,7 +28,8 @@ def summarize(summarizer)
2828

2929
def switch_to(type, new_attributes)
3030
attributes = self.attributes.merge(new_attributes)
31-
new_question = type.constantize.new(attributes.except('id', 'type'))
31+
cloned_attributes = attributes.except('id', 'type', 'submittable_type')
32+
new_question = type.constantize.new(cloned_attributes)
3233
new_question.id = id
3334

3435
begin
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
class ScaleSubmittable
2-
def initialize(question)
3-
@question = question
4-
end
1+
class ScaleSubmittable < ActiveRecord::Base
2+
has_one :question, as: :submittable
53

64
def breakdown
75
sprintf('Average: %.02f', answers.average('text'))
@@ -12,12 +10,12 @@ def score(text)
1210
end
1311

1412
def steps
15-
(@question.minimum..@question.maximum).to_a
13+
(question.minimum..question.maximum).to_a
1614
end
1715

1816
private
1917

2018
def answers
21-
@question.answers
19+
question.answers
2220
end
2321
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class CreateMultipleChoiceSubmittables < ActiveRecord::Migration
2+
def change
3+
create_table :multiple_choice_submittables do |table|
4+
table.timestamps null: false
5+
end
6+
end
7+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class CreateOpenSubmittables < ActiveRecord::Migration
2+
def change
3+
create_table :open_submittables do |table|
4+
table.timestamps null: false
5+
end
6+
end
7+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class CreateScaleSubmittables < ActiveRecord::Migration
2+
def change
3+
create_table :scale_submittables do |table|
4+
table.timestamps null: false
5+
end
6+
end
7+
end

example_app/db/schema.rb

Lines changed: 16 additions & 1 deletion
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 => 20130116211337) do
14+
ActiveRecord::Schema.define(:version => 20130131205918) do
1515

1616
create_table "answers", :force => true do |t|
1717
t.integer "completion_id", :null => false
@@ -48,6 +48,16 @@
4848
add_index "invitations", ["survey_id"], :name => "index_invitations_on_survey_id"
4949
add_index "invitations", ["token"], :name => "index_invitations_on_token", :unique => true
5050

51+
create_table "multiple_choice_submittables", :force => true do |t|
52+
t.datetime "created_at", :null => false
53+
t.datetime "updated_at", :null => false
54+
end
55+
56+
create_table "open_submittables", :force => true do |t|
57+
t.datetime "created_at", :null => false
58+
t.datetime "updated_at", :null => false
59+
end
60+
5161
create_table "options", :force => true do |t|
5262
t.integer "question_id", :null => false
5363
t.string "text", :null => false
@@ -66,6 +76,11 @@
6676
t.integer "maximum"
6777
end
6878

79+
create_table "scale_submittables", :force => true do |t|
80+
t.datetime "created_at", :null => false
81+
t.datetime "updated_at", :null => false
82+
end
83+
6984
create_table "surveys", :force => true do |t|
7085
t.string "title", :null => false
7186
t.datetime "created_at", :null => false

example_app/spec/models/multiple_choice_submittable_spec.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
describe MultipleChoiceSubmittable do
2+
it { should have_one(:question) }
3+
end
4+
15
describe MultipleChoiceSubmittable, '#breakdown' do
26
it 'returns a percentage breakdown' do
37
survey = create(:survey)
@@ -6,7 +10,7 @@
610
options_texts: %w(Blue Red),
711
survey: survey
812
)
9-
submittable = MultipleChoiceSubmittable.new(question)
13+
submittable = MultipleChoiceSubmittable.new(question: question)
1014
taker = AnswerCreator.new(survey)
1115
taker.answer question, 'Red'
1216
taker.answer question, 'Blue'
@@ -19,22 +23,22 @@
1923
describe MultipleChoiceSubmittable, '#options_for_form' do
2024
it 'adds empty options when none are present' do
2125
question = build_stubbed(:multiple_choice_question, options: [])
22-
submittable = MultipleChoiceSubmittable.new(question)
26+
submittable = MultipleChoiceSubmittable.new(question: question)
2327
submittable.options_for_form.count.should == 3
2428
end
2529

2630
it 'leaves existing options alone' do
2731
options = [Option.new(text: 'hey'), Option.new(text: 'hello')]
2832
question = build_stubbed(:multiple_choice_question, options: options)
29-
submittable = MultipleChoiceSubmittable.new(question)
33+
submittable = MultipleChoiceSubmittable.new(question: question)
3034
submittable.options_for_form.map(&:text).should match_array(['hey', 'hello'])
3135
end
3236
end
3337

3438
describe MultipleChoiceSubmittable, '#score' do
3539
it 'returns the score for the option with the given text' do
3640
question = build_stubbed(:multiple_choice_question)
37-
submittable = MultipleChoiceSubmittable.new(question)
41+
submittable = MultipleChoiceSubmittable.new(question: question)
3842
question.options.target.stubs(score: 2)
3943

4044
result = submittable.score('two')

example_app/spec/models/open_submittable_spec.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
describe OpenSubmittable do
2+
it { should have_one(:question) }
3+
end
4+
15
describe OpenSubmittable, '#breakdown' do
26
it 'returns all answers' do
37
survey = create(:survey)
48
question = create(:open_question, survey: survey)
5-
submittable = OpenSubmittable.new(question)
9+
submittable = OpenSubmittable.new(question: question)
610
taker = AnswerCreator.new(survey)
711

812
taker.answer question, 'Hey'
@@ -16,7 +20,7 @@
1620
describe OpenSubmittable, '#score' do
1721
it 'returns zero' do
1822
question = build_stubbed(:open_question)
19-
submittable = OpenSubmittable.new(question)
23+
submittable = OpenSubmittable.new(question: question)
2024

2125
result = submittable.score('anything')
2226

0 commit comments

Comments
 (0)