diff --git a/app/models/appearance.rb b/app/models/appearance.rb index aea34c6..ea5a3ea 100644 --- a/app/models/appearance.rb +++ b/app/models/appearance.rb @@ -2,9 +2,10 @@ class Appearance < ActiveRecord::Base belongs_to :voter, :class_name => "Visitor", :foreign_key => 'voter_id' belongs_to :prompt belongs_to :question - belongs_to :answerable, :polymorphic => true + default_scope :conditions => {:valid_record => true} + def answered? !self.answerable_id.nil? end diff --git a/app/models/question.rb b/app/models/question.rb index 0df5ec8..d637145 100644 --- a/app/models/question.rb +++ b/app/models/question.rb @@ -144,13 +144,9 @@ class Question < ActiveRecord::Base if params[:with_appearance] && visitor_identifier.present? visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier) - last_appearance = visitor.appearances.find(:first, - :conditions => {:question_id => self.id, - :answerable_id => nil - }, - :order => 'id ASC', - :limit => 1) - if last_appearance.nil?|| last_appearance.answered? || !last_appearance.prompt.active? + last_appearance = get_first_unanswered_appearance(visitor) + + if last_appearance.nil? @prompt = choose_prompt(:algorithm => params[:algorithm]) @appearance = current_user.record_appearance(visitor, @prompt) else @@ -163,13 +159,8 @@ class Question < ActiveRecord::Base num_future = params[:future_prompts][:number].to_i rescue 1 num_future.times do |number| offset = number + 1 - last_appearance = visitor.appearances.find(:first, - :conditions => {:question_id => self.id, - :answerable_id => nil - }, - :order => 'id ASC', - :offset => offset) - if last_appearance.nil?|| last_appearance.answered? || !last_appearance.prompt.active? + last_appearance = get_first_unanswered_appearance(visitor, offset) + if last_appearance.nil? @future_prompt = choose_prompt(:algorithm => params[:algorithm]) @future_appearance = current_user.record_appearance(visitor, @future_prompt) else @@ -597,6 +588,23 @@ class Question < ActiveRecord::Base filename end + def get_first_unanswered_appearance(visitor, offset=0) + last_appearance = visitor.appearances.find(:first, + :conditions => {:question_id => self.id, + :answerable_id => nil + }, + :order => 'id ASC', + :offset => offset) + if last_appearance && !last_appearance.prompt.active? + last_appearance.valid_record = false + last_appearance.validity_information = "Deactivated Prompt" + last_appearance.save + + return get_first_unanswered_appearance(visitor) + end + last_appearance + end + end diff --git a/db/schema.rb b/db/schema.rb index 8f6d532..f772103 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20100714160406) do +ActiveRecord::Schema.define(:version => 20100716121029) do create_table "appearances", :force => true do |t| t.integer "voter_id" @@ -21,6 +21,8 @@ ActiveRecord::Schema.define(:version => 20100714160406) do t.datetime "updated_at" t.integer "answerable_id" t.string "answerable_type" + t.boolean "valid_record", :default => true + t.string "validity_information" end add_index "appearances", ["lookup"], :name => "index_appearances_on_lookup" -- libgit2 0.21.2