A refers to relation. Stores the foreign key in the object.
Options
- :field sets the field used in the database schema.
- :foreign_name overrides the deafult foreign name.
- :create_on_insert creates the target object when the referrer is inserted,
example:
class User
has_one :profile, :create_on_insert => true
end
Methods
Public Class methods
[ show source ]
# File lib/og/relation/refers_to.rb, line 28
28: def self.foreign_key(rel)
29: "#{rel[:foreign_name] || rel[:target_singular_name]}_#{rel[:target_class].primary_key}"
30: end
Public Instance methods
[ show source ]
# File lib/og/relation/refers_to.rb, line 32
32: def enchant
33: raise "#{target_singular_name} in #{owner_class} refers to an undefined class" if target_class.nil?
34:
35: self[:foreign_key] = "#{foreign_name || target_singular_name}_#{target_class.primary_key}"
36:
37: if self[:field]
38: field = ", :field => :#{self[:field]}"
39: end
40:
41: target_primary_key_class = target_class.ann(target_class.primary_key, :class)
42:
43: owner_class.ogmanager.with_store do |store|
44: join_table_info = store.join_table_info(self)
45: owner_key = join_table_info[:owner_key]
46:
47: owner_class.module_eval %{
48: attr_accessor :#{target_singular_name}
49: attr_accessor :#{foreign_key}, #{target_primary_key_class}#{field}, :relation => true
50:
51: def #{target_singular_name}(reload = false)
52: return nil if @#{foreign_key}.nil?
53:
54: # will reload if forced or first load or
55: if reload or not @#{target_singular_name}
56: @#{target_singular_name} = #{target_class}[@#{foreign_key}]
57: end
58: @#{target_singular_name}
59: end
60:
61: def #{target_singular_name}=(obj)
62: obj.save if obj.unsaved? unless obj.nil?
63: if obj
64: @#{foreign_key} = obj.#{target_class.primary_key}
65: obj.#{owner_key} = pk if obj.respond_to?(:#{owner_key}=)
66: # obj.save
67: save unless self.unsaved?
68: end
69: return obj
70: end
71: }
72:
73: # Add code to create the target object if create_on_insert == true.
74: #--
75: # gmosx, TODO: optimize the create_on_insert_xxx method.
76: #++
77:
78: if self[:create_on_insert]
79: owner_class.module_eval %{
80: after :create_on_insert_#{target_singular_name}, :on => :og_insert
81:
82: private
83:
84: def create_on_insert_#{target_singular_name}
85: self.#{target_singular_name} = __#{target_singular_name} = #{target_class}.create
86: __#{target_singular_name}.save
87: self.save
88: end
89: }
90: end
91: end
92: end