Sha256: 1b3eaf3a912de185cd1c4ceec36f351da7f73617429159920f845878e44dfda2

Contents?: true

Size: 1.14 KB

Versions: 3

Compression:

Stored size: 1.14 KB

Contents

# frozen_string_literal: true

module Cookbook
  module Mixins
    # ActsAsUseIn Mixin, for things like Tools, Supplies, or Ingredients
    module ActsAsUsedIn
      extend ActiveSupport::Concern

      def acts_as_used_in(*model_symbols)
        extend ClassMethods
        include InstanceMethods

        self.uses_of = model_symbols
        self.label_method = :name

        # Relationships
        has_many :uses, as: :use_of, class_name: 'Cookbook::Use'
        associate_uses_of
      end

      # Extended by acts_as_used_in mixin
      module ClassMethods
        attr_accessor :uses_of, :label_method

        def associate_uses_of
          uses_of.each do |table_sym|
            model = table_sym.to_s.classify.constantize
            name = model.model_name.to_s

            has_many "#{model.model_name.param_key}_uses".to_sym, lambda {
              where(use_in_type: name)
            }, as: :use_of, class_name: 'Cookbook::Use'
            has_many table_sym, through: :uses, source: :use_in, source_type: name
          end
        end
      end

      # Included by has_cookbook mixin
      module InstanceMethods
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
cookbook-0.1.2 lib/cookbook/mixins/acts_as_used_in.rb
cookbook-0.1.1 lib/cookbook/mixins/acts_as_used_in.rb
cookbook-0.1.0 lib/cookbook/mixins/acts_as_used_in.rb