Skip to content

Commit

Permalink
Merge branch 'appearance-creation-transaction'
Browse files Browse the repository at this point in the history
  • Loading branch information
lukebaker committed May 21, 2014
2 parents cb376f2 + 16c4fba commit 0855ea6
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 26 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
@@ -1,3 +1,4 @@
* Create transaction and lock when creating a new appearance.
* Remove votes from vote CSV file that have NA for Appearance ID.
* Alter response for all_object_info_totals_by_date to be valid XML.

Expand Down
62 changes: 36 additions & 26 deletions app/models/question.rb
Expand Up @@ -186,28 +186,31 @@ def get_optional_information(params)
if params[:with_appearance] && visitor_identifier.present?
visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier)

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
#only display a new prompt and new appearance if the old prompt has not been voted on
@appearance = last_appearance
@prompt= @appearance.prompt
Appearance.transaction do
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
#only display a new prompt and new appearance if the old prompt has not been voted on
@appearance = last_appearance
@prompt= @appearance.prompt
end
end

if params[:future_prompts]
num_future = params[:future_prompts][:number].to_i rescue 1
num_future.times do |number|
offset = number + 1
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
@future_appearance = last_appearance
@future_prompt= @future_appearance.prompt
Appearance.transaction do
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
@future_appearance = last_appearance
@future_prompt= @future_appearance.prompt
end
end

result.merge!({"future_appearance_id_#{offset}".to_sym => @future_appearance.lookup})
Expand Down Expand Up @@ -675,21 +678,28 @@ def export(type, options = {})
return csv_data
end

# Gets the user n'th unanswered appearance where n is the value of offset.
#
# Lock is set to true for the SELECT query because this method is called
# inside a transaction that will add a row matching these parameters if one
# doesn't already exist.
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?
unanswered_appearances = visitor.appearances.find(:all,
:conditions => {
:question_id => self.id,
:answerable_id => nil
},
:order => 'id ASC',
:lock => true
)
last_appearance = unanswered_appearances[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
last_appearance
end

def votes_per_uploaded_choice(only_active=false)
Expand Down

0 comments on commit 0855ea6

Please sign in to comment.