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
|