summaryrefslogtreecommitdiff
path: root/app/models/experiment_subject.rb
blob: 2a7b9017a516c98238a3121d2d28cdc26a4facc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# frozen_string_literal: true

class ExperimentSubject < ApplicationRecord
  include ::Gitlab::Experimentation::GroupTypes

  belongs_to :experiment, inverse_of: :experiment_subjects
  belongs_to :user
  belongs_to :namespace
  belongs_to :project

  validates :experiment, presence: true
  validates :variant, presence: true
  validate :must_have_one_subject_present

  enum variant: { GROUP_CONTROL => 0, GROUP_EXPERIMENTAL => 1 }

  def self.valid_subject?(subject)
    subject.is_a?(Namespace) || subject.is_a?(User) || subject.is_a?(Project)
  end

  private

  def must_have_one_subject_present
    if non_nil_subjects.length != 1
      errors.add(:base, s_("ExperimentSubject|Must have exactly one of User, Namespace, or Project."))
    end
  end

  def non_nil_subjects
    @non_nil_subjects ||= [user, namespace, project].reject(&:blank?)
  end
end