Class DataMapper::Associations::HasAndBelongsToManyAssociation
In: lib/data_mapper/associations/has_and_belongs_to_many_association.rb
lib/data_mapper/associations/has_and_belongs_to_many_association.rb
Parent: Object

Methods

Classes and Modules

Class DataMapper::Associations::HasAndBelongsToManyAssociation::Set

Attributes

adapter  [R] 
adapter  [R] 

Public Class methods

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 8
 8:       def initialize(klass, association_name, options)
 9:         @adapter = database.adapter
10:         @key_table = adapter.table(klass)
11:         @self_referential = (association_name.to_s == @key_table.name)
12:         @association_name = association_name.to_sym
13:         @options = options
14: 
15:         define_accessor(klass)
16:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 8
 8:       def initialize(klass, association_name, options)
 9:         @adapter = database.adapter
10:         @key_table = adapter.table(klass)
11:         @self_referential = (association_name.to_s == @key_table.name)
12:         @association_name = association_name.to_sym
13:         @options = options
14: 
15:         define_accessor(klass)
16:       end

Public Instance methods

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 55
55:       def activate!(force = false)
56:         join_columns.each {|column| column unless join_table.mapped_column_exists?(column.name)}
57:         join_table.create!(force)
58:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 55
55:       def activate!(force = false)
56:         join_columns.each {|column| column unless join_table.mapped_column_exists?(column.name)}
57:         join_table.create!(force)
58:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 60
60:       def associated_columns
61:         associated_table.columns.reject { |column| column.lazy? } + join_columns
62:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 60
60:       def associated_columns
61:         associated_table.columns.reject { |column| column.lazy? } + join_columns
62:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 68
68:       def associated_table
69:         @associated_table || (@associated_table = adapter.table(constant))
70:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 68
68:       def associated_table
69:         @associated_table || (@associated_table = adapter.table(constant))
70:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 38
38:       def constant
39:         @associated_class || @associated_class = begin
40: 
41:           if @options.has_key?(:class) || @options.has_key?(:class_name)
42:             associated_class_name = (@options[:class] || @options[:class_name])
43:             if associated_class_name.kind_of?(String)
44:               Kernel.const_get(Inflector.classify(associated_class_name))
45:             else
46:               associated_class_name
47:             end
48:           else
49:             Kernel.const_get(Inflector.classify(@association_name))
50:           end
51: 
52:         end
53:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 38
38:       def constant
39:         @associated_class || @associated_class = begin
40: 
41:           if @options.has_key?(:class) || @options.has_key?(:class_name)
42:             associated_class_name = (@options[:class] || @options[:class_name])
43:             if associated_class_name.kind_of?(String)
44:               Kernel.const_get(Inflector.classify(associated_class_name))
45:             else
46:               associated_class_name
47:             end
48:           else
49:             Kernel.const_get(Inflector.classify(@association_name))
50:           end
51: 
52:         end
53:       end

Define the association instance method (i.e. Project#tasks)

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 180
180:       def define_accessor(klass)
181:         klass.class_eval "def \#{@association_name}\n@\#{@association_name} || (@\#{@association_name} = HasAndBelongsToManyAssociation::Set.new(self, \#{@association_name.inspect}))\nend\n\ndef \#{@association_name}=(value)\n\#{@association_name}.set(value)\nend\n\nprivate\ndef \#{@association_name}_keys=(value)\n\#{@association_name}.clear\n\nassociated_constant = \#{@association_name}.association.constant\nassociated_table = \#{@association_name}.association.associated_table\nassociated_constant.all(associated_table.key => [*value]).each do |entry|\n\#{@association_name} << entry\nend\nend\n"
182:       end

Define the association instance method (i.e. Project#tasks)

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 180
180:       def define_accessor(klass)
181:         klass.class_eval "def \#{@association_name}\n@\#{@association_name} || (@\#{@association_name} = HasAndBelongsToManyAssociation::Set.new(self, \#{@association_name.inspect}))\nend\n\ndef \#{@association_name}=(value)\n\#{@association_name}.set(value)\nend\n\nprivate\ndef \#{@association_name}_keys=(value)\n\#{@association_name}.clear\n\nassociated_constant = \#{@association_name}.association.constant\nassociated_table = \#{@association_name}.association.associated_table\nassociated_constant.all(associated_table.key => [*value]).each do |entry|\n\#{@association_name} << entry\nend\nend\n"
182:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 26
26:       def dependency
27:         @options[:dependent]
28:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 26
26:       def dependency
27:         @options[:dependent]
28:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 30
30:       def foreign_name
31:         @foreign_name || (@foreign_name = (@options[:foreign_name] || @key_table.name).to_sym)
32:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 30
30:       def foreign_name
31:         @foreign_name || (@foreign_name = (@options[:foreign_name] || @key_table.name).to_sym)
32:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 64
64:       def join_columns
65:         [ left_foreign_key, right_foreign_key ]
66:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 64
64:       def join_columns
65:         [ left_foreign_key, right_foreign_key ]
66:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 72
72:       def join_table
73:         @join_table || @join_table = begin
74:           join_table_name = @options[:join_table] ||
75:             [ @key_table.name.to_s, database.schema[constant].name.to_s ].sort.join('_')
76: 
77:           adapter.table(join_table_name)
78:         end
79:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 72
72:       def join_table
73:         @join_table || @join_table = begin
74:           join_table_name = @options[:join_table] ||
75:             [ @key_table.name.to_s, database.schema[constant].name.to_s ].sort.join('_')
76: 
77:           adapter.table(join_table_name)
78:         end
79:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 81
81:       def left_foreign_key
82:         @left_foreign_key || @left_foreign_key = begin
83:           join_table.add_column(
84:             (@options[:left_foreign_key] || @key_table.default_foreign_key),
85:             :integer, :nullable => true, :key => true)
86:         end
87:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 81
81:       def left_foreign_key
82:         @left_foreign_key || @left_foreign_key = begin
83:           join_table.add_column(
84:             (@options[:left_foreign_key] || @key_table.default_foreign_key),
85:             :integer, :nullable => true, :key => true)
86:         end
87:       end

def key_table

  @key_table

end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 22
22:       def name
23:         @association_name
24:       end

def key_table

  @key_table

end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 22
22:       def name
23:         @association_name
24:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 89
89:       def right_foreign_key
90:         if self_referential?
91:           @options[:right_foreign_key] ||= ["related_", associated_table.default_foreign_key].to_s
92:         end
93: 
94:         @right_foreign_key || @right_foreign_key = begin
95:           join_table.add_column(
96:             (@options[:right_foreign_key] || associated_table.default_foreign_key),
97:             :integer, :nullable => true, :key => true)
98:         end
99:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 89
89:       def right_foreign_key
90:         if self_referential?
91:           @options[:right_foreign_key] ||= ["related_", associated_table.default_foreign_key].to_s
92:         end
93: 
94:         @right_foreign_key || @right_foreign_key = begin
95:           join_table.add_column(
96:             (@options[:right_foreign_key] || associated_table.default_foreign_key),
97:             :integer, :nullable => true, :key => true)
98:         end
99:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 34
34:       def self_referential?
35:         @self_referential
36:       end

[Source]

    # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 34
34:       def self_referential?
35:         @self_referential
36:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 161
161:       def to_delete_member_sql
162:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} = ?\nAND \#{right_foreign_key.to_sql} = ?\n"
163:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 161
161:       def to_delete_member_sql
162:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} = ?\nAND \#{right_foreign_key.to_sql} = ?\n"
163:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 153
153:       def to_delete_members_sql
154:         "DELETE FROM \#{associated_table.to_sql}\nWHERE \#{associated_table.key.to_sql} IN ?\n".compress_lines
155:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 153
153:       def to_delete_members_sql
154:         "DELETE FROM \#{associated_table.to_sql}\nWHERE \#{associated_table.key.to_sql} IN ?\n".compress_lines
155:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 144
144:       def to_delete_set_sql
145:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} IN ?\nOR \#{right_foreign_key.to_sql} IN ?\n".compress_lines
146:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 144
144:       def to_delete_set_sql
145:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} IN ?\nOR \#{right_foreign_key.to_sql} IN ?\n".compress_lines
146:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 136
136:       def to_delete_sql
137:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} = ?\n".compress_lines
138:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 136
136:       def to_delete_sql
137:         "DELETE FROM \#{join_table.to_sql}\nWHERE \#{left_foreign_key.to_sql} = ?\n".compress_lines
138:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 170
170:       def to_disassociate_sql
171:         "UPDATE \#{join_table.to_sql}\nSET \#{left_foreign_key.to_sql} = NULL\nWHERE \#{left_foreign_key.to_sql} = ?\n"
172:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 170
170:       def to_disassociate_sql
171:         "UPDATE \#{join_table.to_sql}\nSET \#{left_foreign_key.to_sql} = NULL\nWHERE \#{left_foreign_key.to_sql} = ?\n"
172:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 127
127:       def to_insert_sql
128:         "INSERT INTO \#{join_table.to_sql}\n(\#{left_foreign_key.to_sql}, \#{right_foreign_key.to_sql})\nVALUES\n".compress_lines
129:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 127
127:       def to_insert_sql
128:         "INSERT INTO \#{join_table.to_sql}\n(\#{left_foreign_key.to_sql}, \#{right_foreign_key.to_sql})\nVALUES\n".compress_lines
129:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 111
111:       def to_shallow_sql
112:         if self_referential?
113:           "JOIN \#{join_table.to_sql} ON\n\#{right_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\n".compress_lines
114:         else
115:         "JOIN \#{join_table.to_sql} ON\n\#{left_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\n".compress_lines
116:         end
117:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 111
111:       def to_shallow_sql
112:         if self_referential?
113:           "JOIN \#{join_table.to_sql} ON\n\#{right_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\n".compress_lines
114:         else
115:         "JOIN \#{join_table.to_sql} ON\n\#{left_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\n".compress_lines
116:         end
117:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 101
101:       def to_sql
102:         "JOIN \#{join_table.to_sql} ON\n\#{left_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\nJOIN \#{associated_table.to_sql} ON\n\#{associated_table.key.to_sql(true)} = \#{right_foreign_key.to_sql(true)}\n".compress_lines
103:       end

[Source]

     # File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 101
101:       def to_sql
102:         "JOIN \#{join_table.to_sql} ON\n\#{left_foreign_key.to_sql(true)} = \#{@key_table.key.to_sql(true)}\nJOIN \#{associated_table.to_sql} ON\n\#{associated_table.key.to_sql(true)} = \#{right_foreign_key.to_sql(true)}\n".compress_lines
103:       end

[Validate]