Module: SurveyParser

Defined in:
lib/surveyor/survey_extensions.rb

Overview

if surveyor_gem = Gem.searcher.find(‘surveyor’)

github.com/breakpointer/surveyor/issues/issue/45

Survey access_code not guaranteed to be unique

As there is no model validation or unique index in the database, there is no guarantee that your survey access_code will be unique. It is just a normalized version of your survey title.

Running … <pre> rake surveyor FILE=surveys/kitchen_sink_survey.rb APPEND=true rake surveyor FILE=surveys/kitchen_sink_survey.rb APPEND=true script/console Survey.all.collect(&:access_code) </pre> should show this to be true.

This will show both surveys as able to be taken, but will only allow the first one when the attempt is made as the survey is found by

<pre> </pre>

In addition, adding a unique index to the db and model will make a mess when running <pre> rake surveyor FILE=surveys/kitchen_sink_survey.rb APPEND=true rake surveyor FILE=surveys/kitchen_sink_survey.rb APPEND=true </pre> as the access_code is not unique and the survey fixtures are loaded last, leaving the associations with an invalid survey_id.

To avoid this, the survey fixture should probably be attempted first.

Update…

Adding something like … <pre> def access_code=(value)

counter = 2
original_value = value
while( ( survey = Survey.find_by_access_code(value) ) && 
  ( self.id != survey.id ) )
  value = [original_value,"_",counter].join
  counter += 1
end
super

end </pre> … to Survey seems to provide a “fix” for this “problem”, although I don’t know how kosher it is.

It works in my test environment, but does not actually work in the “rake surveyor” task as the survey is built from a different Survey model completely and then loaded into the database and not created though the application.

My final “fix” was to add <pre> require ‘lib/surveyor/survey_extensions’ </pre> to my Rakefile and create the file <pre> > cat lib/surveyor/survey_extensions.rb if surveyor_gem = Gem.searcher.find(‘surveyor’)

require surveyor_gem.full_gem_path + '/script/surveyor/parser'
require surveyor_gem.full_gem_path + '/script/surveyor/survey'

end

module SurveyParser module SurveyExtensions

def self.included(base)
  base.class_eval do
    def initialize_with_unique_access_code(obj, args, opts)
      initialize_without_unique_access_code(obj, args, opts)
      counter = 2
      ac = self.access_code
      original_ac = self.access_code
      while( survey = ::Survey.find_by_access_code(ac) ) 
        ac = [original_ac,"_",counter].join
        counter += 1
      end
      self.access_code = ac
    end
    alias_method_chain :initialize, :unique_access_code
  end
end

end end SurveyParser::Survey.send(:include, SurveyParser::SurveyExtensions) </pre> It is not as clean as I would’ve liked, but works.

Defined Under Namespace

Modules: SurveyExtensions