Commit 439818b83cdb98156b848610b657328de7a4add6
1 parent
6e9fe757
Exists in
master
and in
1 other branch
Get rid of mandatory two choices
Showing
3 changed files
with
41 additions
and
41 deletions
Show diff stats
app/models/choice.rb
| ... | ... | @@ -52,7 +52,7 @@ class Choice < ActiveRecord::Base |
| 52 | 52 | |
| 53 | 53 | after_create :generate_prompts |
| 54 | 54 | def before_create |
| 55 | - puts "just got inside choice#before_create. is set to active? #{self.active?}" | |
| 55 | + #puts "just got inside choice#before_create. is set to active? #{self.active?}" | |
| 56 | 56 | unless item |
| 57 | 57 | @item = Item.create!(:creator => creator, :data => data) |
| 58 | 58 | self.item = @item |
| ... | ... | @@ -61,10 +61,10 @@ class Choice < ActiveRecord::Base |
| 61 | 61 | self.score = 50.0 |
| 62 | 62 | end |
| 63 | 63 | unless self.active? |
| 64 | - puts "this choice was not specifically set to active, so we are now asking if we should auto-activate" | |
| 64 | + #puts "this choice was not specifically set to active, so we are now asking if we should auto-activate" | |
| 65 | 65 | self.active = question.should_autoactivate_ideas? ? true : false |
| 66 | - puts "should question autoactivate? #{question.should_autoactivate_ideas?}" | |
| 67 | - puts "will this choice be active? #{self.active}" | |
| 66 | + #puts "should question autoactivate? #{question.should_autoactivate_ideas?}" | |
| 67 | + #puts "will this choice be active? #{self.active}" | |
| 68 | 68 | end |
| 69 | 69 | return true #so active record will save |
| 70 | 70 | end | ... | ... |
app/models/question.rb
| ... | ... | @@ -20,10 +20,17 @@ class Question < ActiveRecord::Base |
| 20 | 20 | has_many :skips |
| 21 | 21 | has_many :densities |
| 22 | 22 | has_many :appearances |
| 23 | - | |
| 24 | - #comment out to run bt import script! | |
| 25 | - after_save :ensure_at_least_two_choices | |
| 23 | + | |
| 26 | 24 | attr_accessor :ideas |
| 25 | + after_create :create_choices_from_ideas | |
| 26 | + def create_choices_from_ideas | |
| 27 | + if ideas.any? | |
| 28 | + ideas.each do |idea| | |
| 29 | + item = Item.create!(:data => idea.squish.strip, :creator => self.creator) | |
| 30 | + choices.create!(:item => item, :creator => self.creator, :active => true, :data => idea.squish.strip) | |
| 31 | + end | |
| 32 | + end | |
| 33 | + end | |
| 27 | 34 | |
| 28 | 35 | def item_count |
| 29 | 36 | choices.size |
| ... | ... | @@ -284,19 +291,6 @@ class Question < ActiveRecord::Base |
| 284 | 291 | validates_presence_of :site, :on => :create, :message => "can't be blank" |
| 285 | 292 | validates_presence_of :creator, :on => :create, :message => "can't be blank" |
| 286 | 293 | |
| 287 | - def ensure_at_least_two_choices | |
| 288 | - the_ideas = (self.ideas.blank? || self.ideas.empty?) ? ['sample idea 1', 'sample idea 2'] : self.ideas | |
| 289 | - the_ideas << 'sample choice' if the_ideas.length < 2 | |
| 290 | - if self.choices.empty? | |
| 291 | - the_ideas.each { |choice_text| | |
| 292 | - item = Item.create!({:data => choice_text, :creator => creator}) | |
| 293 | - puts item.inspect | |
| 294 | - choice = choices.create!(:item => item, :creator => creator, :active => true, :data => choice_text) | |
| 295 | - puts choice.inspect | |
| 296 | - } | |
| 297 | - end | |
| 298 | - end | |
| 299 | - | |
| 300 | 294 | def density |
| 301 | 295 | # slow code, only to be run by cron job once at night |
| 302 | 296 | ... | ... |
spec/models/question_spec.rb
| ... | ... | @@ -13,7 +13,7 @@ describe Question do |
| 13 | 13 | it {should validate_presence_of :creator} |
| 14 | 14 | |
| 15 | 15 | before(:each) do |
| 16 | - @aoi_clone = Factory.create(:user, :email => "pius@alum.mit.edu", :password => "password", :password_confirmation => "password", :id => 8) | |
| 16 | + @aoi_clone = Factory.create(:user,:password => "password", :password_confirmation => "password", :id => 8) | |
| 17 | 17 | @valid_attributes = { |
| 18 | 18 | :site => @aoi_clone, |
| 19 | 19 | :creator => @aoi_clone.default_visitor |
| ... | ... | @@ -21,44 +21,49 @@ describe Question do |
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | @question = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) |
| 24 | + @question.it_should_autoactivate_ideas = true | |
| 25 | + @question.save! | |
| 26 | + | |
| 27 | + 2.times.each do |num| | |
| 28 | + @aoi_clone.create_choice("visitor identifier", @question, {:data => num.to_s, :local_identifier => "example"}) | |
| 29 | + end | |
| 30 | + | |
| 31 | + @question.reload | |
| 32 | + | |
| 24 | 33 | |
| 25 | 34 | end |
| 35 | + | |
| 36 | + it "should have 2 active choices" do | |
| 37 | + @question.choices.active.reload.size.should == 2 | |
| 38 | + end | |
| 26 | 39 | |
| 27 | 40 | it "should create a new instance given valid attributes" do |
| 28 | 41 | Question.create!(@valid_attributes) |
| 29 | 42 | end |
| 30 | 43 | |
| 31 | - it "should be creatable by a user" do | |
| 44 | + it "should not create two default choices if none are provided" do | |
| 32 | 45 | q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) |
| 33 | - end | |
| 34 | - | |
| 35 | - it "should create two default choices if none are provided" do | |
| 36 | - q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) | |
| 37 | - q.choices(true).size.should == 2 | |
| 46 | + q.choices(true).size.should == 0 | |
| 38 | 47 | end |
| 39 | 48 | |
| 40 | 49 | it "should generate prompts after choices are added" do |
| 41 | - q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) | |
| 42 | - q.prompts(true).size.should == 2 | |
| 50 | + @question.prompts(true).size.should == 2 | |
| 43 | 51 | end |
| 44 | 52 | |
| 45 | 53 | it "should choose an active prompt randomly" do |
| 46 | - q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) | |
| 47 | - prompt = q.picked_prompt | |
| 54 | + prompt = @question.picked_prompt | |
| 48 | 55 | prompt.active?.should == true |
| 49 | 56 | end |
| 50 | 57 | |
| 51 | 58 | it "should choose an active prompt using catchup algorithm" do |
| 52 | - q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) | |
| 53 | - prompt = q.catchup_choose_prompt | |
| 59 | + prompt = @question.catchup_choose_prompt | |
| 54 | 60 | prompt.active?.should == true |
| 55 | 61 | end |
| 56 | 62 | |
| 57 | - it "should return nil if there is no possible prompt to choose" do | |
| 58 | - q = @aoi_clone.create_question("foobarbaz", {:name => 'foo'}) | |
| 59 | - q.choices.first.deactivate! | |
| 60 | - q.reload | |
| 61 | - q.choose_prompt.should be_nil | |
| 63 | + it "should raise runtime exception if there is no possible prompt to choose" do | |
| 64 | + @question.choices.first.deactivate! | |
| 65 | + @question.reload | |
| 66 | + lambda { @question.choose_prompt}.should raise_error(RuntimeError) | |
| 62 | 67 | |
| 63 | 68 | end |
| 64 | 69 | |
| ... | ... | @@ -121,6 +126,7 @@ describe Question do |
| 121 | 126 | 100.times.each do |num| |
| 122 | 127 | user.create_choice("visitor identifier", @catchup_q, {:data => num.to_s, :local_identifier => "exmaple"}) |
| 123 | 128 | end |
| 129 | + @catchup_q.reload | |
| 124 | 130 | end |
| 125 | 131 | |
| 126 | 132 | |
| ... | ... | @@ -131,11 +137,11 @@ describe Question do |
| 131 | 137 | |
| 132 | 138 | it "should choose an active prompt using catchup algorithm on a large number of choices" do |
| 133 | 139 | @catchup_q.reload |
| 134 | - # Sanity check, 2 extra choices are autocreated when empty question created | |
| 135 | - @catchup_q.choices.size.should == 102 | |
| 140 | + # Sanity check | |
| 141 | + @catchup_q.choices.size.should == 100 | |
| 136 | 142 | |
| 137 | 143 | #the catchup algorithm depends on all prompts being generated automatically |
| 138 | - @catchup_q.prompts.size.should == 102 **2 - 102 | |
| 144 | + @catchup_q.prompts.size.should == 100 **2 - 100 | |
| 139 | 145 | |
| 140 | 146 | prompt = @catchup_q.catchup_choose_prompt |
| 141 | 147 | prompt.active?.should == true | ... | ... |