Sha256: 7fb99b7fea93fbf849d4ea2a2bbe4ba0ac842cc7a9cb5960ab023ee4ad2e1527

Contents?: true

Size: 1.69 KB

Versions: 2

Compression:

Stored size: 1.69 KB

Contents

class ABTest < ActiveRecord::Base
  
  set_table_name :a_b_tests
  has_many :variants, :class_name => 'ABVariant', :foreign_key => 'a_b_test_id', :dependent => :delete_all
  
  validates_uniqueness_of :name
  
  after_save :destroy_variants
  after_save :create_variants
  after_save :set_control
  
  def control
    self.variants.find_by_control true
  end
  
  def sorted_variants
    self.variants.find(:all, :order => 'control desc, conversions / visitors desc, visitors desc')
  end
  
  def variant_names
    names = self.variants.collect &:name
    names.delete self.control.name
    names.unshift self.control.name
  end
  
  def variants=(names)
    names = names.gsub(/[^,\w]/, '').split(',').uniq
    current_names = variants.collect(&:name).uniq
    @control = names.first
    @new_variant_names = names - current_names
    @removed_variant_names = current_names - names
  end
  
  private
  
  def create_variants
    return unless @new_variant_names
    @new_variant_names.each do |name|
      self.variants.create(:name => name)
    end
  end
  
  def destroy_variants
    return unless @removed_variant_names
    remove = self.variants.find(:all, :conditions => { :name => @removed_variant_names })
    remove.each do |variant|
      variant.destroy
    end
  end
  
  def set_control
    if @control
      if self.control
        self.control.update_attribute(:control, false)
      end
      if name = self.variants.find_by_name(@control)
        name.update_attribute(:control, true)
      elsif !self.variants.empty?
        self.variants.first.update_attribute(:control, true)
      end
    elsif !self.control && !self.variants.empty?
      self.variants.first.update_attribute(:control, true)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
a_b-0.1.1 lib/a_b/model/a_b_test.rb
a_b-0.1.0 lib/a_b/model/a_b_test.rb