Module: Soulless::Associations

Defined in:
lib/soulless/associations.rb

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



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
33
# File 'lib/soulless/associations.rb', line 3

def self.included(base)
  base.instance_eval do
    @association_attributes = []
    
    class << self
      attr_reader :association_attributes
    end
    
    def has_one(name, superclass = Object, &block)
      klass = define_virtus_class(name, superclass, &block)
      send(:attribute, name, klass)
    end
    
    def has_many(name, superclass = Object, &block)
      klass = define_virtus_class(name, superclass, &block)
      send(:attribute, name, Array[klass])
    end
    
    private
    def define_virtus_class(name, superclass, &block)
      @association_attributes << name
      klass_name = name.to_s.singularize.classify + '_' + SecureRandom.hex
      klass = const_set(klass_name, Class.new(superclass))
      klass.send(:include, Soulless.model) unless klass.included_modules.include?(Model)
      klass.send(:attr_accessor, :parent)
      klass.instance_eval(&block) if block_given?
      klass.model_name.instance_variable_set(:@i18n_key, klass.model_name.i18n_key.to_s.gsub(/_[^_]+$/, '').underscore.to_sym)
      klass
    end
  end
end