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 |
adapter | [R] | |
adapter | [R] |
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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)
# 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)
# 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
# File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 26 26: def dependency 27: @options[:dependent] 28: end
# File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 26 26: def dependency 27: @options[:dependent] 28: end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 22 22: def name 23: @association_name 24: end
# 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
# 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
# File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 34 34: def self_referential? 35: @self_referential 36: end
# File lib/data_mapper/associations/has_and_belongs_to_many_association.rb, line 34 34: def self_referential? 35: @self_referential 36: end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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