module ActiveRecord::Associations::ClassMethods

Public Class Methods

included(base) click to toggle source
# File lib/belongs_to_one_of.rb, line 70
def self.included(base)
  base.extend(ClassMethods)
end

Public Instance Methods

belongs_to_one_of( resource_key, raw_possible_resource_types, include_type_column: false ) click to toggle source
# File lib/belongs_to_one_of.rb, line 15
def belongs_to_one_of(
  resource_key,
  raw_possible_resource_types,
  include_type_column: false
)
  resource_type_field = "#{resource_key}_type"
  unless [true, false].include?(include_type_column)
    resource_type_field =
      include_type_column
  end

  config_model = BelongsToOneOfModel.new(
    resource_key,
    raw_possible_resource_types,
    include_type_column,
    resource_type_field,
    self,
  )

  # validators
  define_method "belongs_to_exactly_one_#{resource_key}" do
    config_model.validate_exactly_one_resource(self)
  end

  define_method "belongs_to_at_most_one_#{resource_key}" do
    config_model.validate_at_most_one_resource(self)
  end

  if include_type_column
    define_method "#{resource_type_field}_matches_#{resource_key}" do
      config_model.validate_correct_resource_type(self)
    end
  end

  # setters
  define_method "#{resource_key}=" do |resource|
    config_model.resource_setter(resource, self)
  end

  # getters
  define_method resource_key do
    config_model.resource_getter(self)
  end

  define_method "#{resource_key}_id" do
    config_model.resource_id_getter(self)
  end

  unless include_type_column
    define_method "#{resource_key}_type" do
      config_model.resource_type_getter(self)
    end
  end
end