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
foreign_key(rel)
    # 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
enchant()
    # 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