Module: SuperModel::Associations::BelongsTo

Defined in:
lib/super_model/associations/belongs_to.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.def_association_methods(options = {}) ⇒ Object



25
26
27
28
29
30
31
32
33
34
# File 'lib/super_model/associations/belongs_to.rb', line 25

def def_association_methods(options={})
  Error::HashType.check( options, required_keys: [:class, :resource_name, :getter_proc, :setter_proc] )
  Error::ProcType.check( options[:getter_proc] )
  Error::ProcType.check( options[:setter_proc] )
  
  options[:class].instance_eval do
    define_method( options[:resource_name], &options[:getter_proc] )
    define_method( "#{ options[:resource_name] }=", &options[:setter_proc] )
  end
end

.def_foreign_key_methods(options = {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/super_model/associations/belongs_to.rb', line 13

def def_foreign_key_methods(options={})
  Error::HashType.check( options, required_keys: [:class, :foreign_key] )
  
  options[:class].instance_eval do
    attr_reader options[:foreign_key]
    
    define_method("#{ options[:foreign_key] }=") do |value|
      instance_variable_set( "@#{ options[:foreign_key] }", Error::IntegerType.check(value) )
    end
  end
end

Instance Method Details

#belongs_to(resource_name, options = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/super_model/associations/belongs_to.rb', line 38

def belongs_to(resource_name, options={})
  options[:resource_name] ||= SuperModel::Associations.sanitize_resource_name( resource_name, :singular )
  options[:foreign_key] ||= SuperModel::Associations.foreign_key_for( options[:resource_name], :singular )
  
  BelongsTo.def_foreign_key_methods(
    class: self,
    foreign_key: options[:foreign_key]
  )
  
  BelongsTo.def_association_methods(
    class: self,
    resource_name: options[:resource_name],
    getter_proc: Proc.new do
      ObjectSpace._id2ref( instance_variable_get("@#{ options[:foreign_key] }") ) if instance_variable_defined?("@#{ options[:foreign_key] }")
    end,
    setter_proc: Proc.new do |value|
      send( "#{ options[:foreign_key] }=", value.object_id )
    end
  )
  
end