Sha256: 6e1600b8a42f4ac5b152800828391ee3cb3ec35bcf69aa37f2931bb73e6d28c5

Contents?: true

Size: 1.25 KB

Versions: 2

Compression:

Stored size: 1.25 KB

Contents

module Metry
  class Experiment
    include MongoMapper::Document
    METHODS = {
      "rand" => proc{|list, experiment| list.sort_by{rand}.first},
      "sequential" => proc do |list, experiment|
        r = list[experiment.counter%list.size]
        experiment.counter += 1
        experiment.save
        r
      end
    }
    
    key :name, String
    key :counter, Integer, :default => 0
    
    many :cohorts, :class_name => 'Metry::Cohort', :foreign_key => 'experiment_id'
    many :goals, :class_name => "Metry::Goal", :foreign_key => "experiment_id"
    
    def self.find_or_create_by_name(name)
      find(:first, :conditions => {:name => name}) || create(:name => name)
    end
        
    def lookup_cohort(name)
      cohort = cohorts.find(:first, :conditions => {:name => name})
      unless cohort
        cohort = Cohort.create(:name => name)
        cohorts << cohort
      end
      cohort
    end
    
    def cohort_for(visitor)
      cohorts.detect{|e| e.visitor_ids.include?(visitor.id)}
    end
    
    def choose(options, method, event, visitor)
      cohort = cohort_for(visitor)
      unless cohort
        cohort = lookup_cohort(METHODS[method||'rand'][options, self])
        visitor.in_cohort(cohort)
      end
      cohort.name
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
metry-2.1.0 lib/metry/experiment.rb
metry-2.1.1 lib/metry/experiment.rb