* Add HTML variants for cta optimization and other nav bar adjustments * Fix 1==1 non-random mistake * Spruce up org call-to-action * Change default text color * Add html variant trial and success request specs * Fix article sidebar caching issue * One line adjustment * Modify schema * Add include ActionView::Helpers::TagHelper to user_tag_spec * Modify follow_button to remove session context * Dummy commit * Change Edit Article to Edit Post * Dummy commit * Fix rubocop concerns * Fix rubocop style
40 lines
1.3 KiB
Ruby
40 lines
1.3 KiB
Ruby
class HtmlVariant < ApplicationRecord
|
|
validates :html, presence: true
|
|
validates :name, uniqueness: true
|
|
validates :group, inclusion: { in: %w(article_show_sidebar_cta) }
|
|
validates :success_rate, presence: true
|
|
validate :no_edits
|
|
belongs_to :user, optional: true
|
|
has_many :html_variant_trials
|
|
has_many :html_variant_successes
|
|
|
|
def calculate_success_rate!
|
|
self.success_rate = html_variant_successes.size.to_f / (html_variant_trials.size * 10.0) # x10 because we only capture every 10th
|
|
save!
|
|
end
|
|
|
|
def self.find_for_test(tags = [])
|
|
tags_array = tags + ["", nil]
|
|
if rand(10) == 1 # 10% return completely random
|
|
find_random_for_test(tags_array)
|
|
else # 90% chance return one in top 10
|
|
find_top_for_test(tags_array)
|
|
end
|
|
end
|
|
|
|
def self.find_top_for_test(tags_array)
|
|
where(group: "article_show_sidebar_cta", approved: true, published: true, target_tag: tags_array).order("success_rate DESC").limit(rand(1..10)).sample
|
|
end
|
|
|
|
def self.find_random_for_test(tags_array)
|
|
where(group: "article_show_sidebar_cta", approved: true, published: true, target_tag: tags_array).order("RANDOM()").first
|
|
end
|
|
|
|
private
|
|
|
|
def no_edits
|
|
if (approved && html_changed? || name_changed? || group_changed?) && persisted?
|
|
errors.add(:base, "cannot change once published and approved")
|
|
end
|
|
end
|
|
end
|