sskirby-activerecord 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. data/CHANGELOG.md +6749 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +222 -0
  4. data/examples/associations.png +0 -0
  5. data/examples/performance.rb +177 -0
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record.rb +147 -0
  8. data/lib/active_record/aggregations.rb +255 -0
  9. data/lib/active_record/associations.rb +1604 -0
  10. data/lib/active_record/associations/alias_tracker.rb +79 -0
  11. data/lib/active_record/associations/association.rb +239 -0
  12. data/lib/active_record/associations/association_scope.rb +119 -0
  13. data/lib/active_record/associations/belongs_to_association.rb +79 -0
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +34 -0
  15. data/lib/active_record/associations/builder/association.rb +55 -0
  16. data/lib/active_record/associations/builder/belongs_to.rb +85 -0
  17. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  19. data/lib/active_record/associations/builder/has_many.rb +71 -0
  20. data/lib/active_record/associations/builder/has_one.rb +62 -0
  21. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  22. data/lib/active_record/associations/collection_association.rb +574 -0
  23. data/lib/active_record/associations/collection_proxy.rb +132 -0
  24. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +62 -0
  25. data/lib/active_record/associations/has_many_association.rb +108 -0
  26. data/lib/active_record/associations/has_many_through_association.rb +180 -0
  27. data/lib/active_record/associations/has_one_association.rb +73 -0
  28. data/lib/active_record/associations/has_one_through_association.rb +36 -0
  29. data/lib/active_record/associations/join_dependency.rb +214 -0
  30. data/lib/active_record/associations/join_dependency/join_association.rb +154 -0
  31. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  32. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  33. data/lib/active_record/associations/join_helper.rb +55 -0
  34. data/lib/active_record/associations/preloader.rb +177 -0
  35. data/lib/active_record/associations/preloader/association.rb +127 -0
  36. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  37. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  38. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  39. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  40. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  41. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  42. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  43. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  44. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  45. data/lib/active_record/associations/singular_association.rb +64 -0
  46. data/lib/active_record/associations/through_association.rb +83 -0
  47. data/lib/active_record/attribute_assignment.rb +221 -0
  48. data/lib/active_record/attribute_methods.rb +272 -0
  49. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  50. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  51. data/lib/active_record/attribute_methods/dirty.rb +101 -0
  52. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  53. data/lib/active_record/attribute_methods/query.rb +39 -0
  54. data/lib/active_record/attribute_methods/read.rb +135 -0
  55. data/lib/active_record/attribute_methods/serialization.rb +93 -0
  56. data/lib/active_record/attribute_methods/time_zone_conversion.rb +62 -0
  57. data/lib/active_record/attribute_methods/write.rb +69 -0
  58. data/lib/active_record/autosave_association.rb +422 -0
  59. data/lib/active_record/base.rb +716 -0
  60. data/lib/active_record/callbacks.rb +275 -0
  61. data/lib/active_record/coders/yaml_column.rb +41 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +188 -0
  64. data/lib/active_record/connection_adapters/abstract/database_limits.rb +58 -0
  65. data/lib/active_record/connection_adapters/abstract/database_statements.rb +388 -0
  66. data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -0
  67. data/lib/active_record/connection_adapters/abstract/quoting.rb +115 -0
  68. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +492 -0
  69. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +598 -0
  70. data/lib/active_record/connection_adapters/abstract_adapter.rb +296 -0
  71. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +653 -0
  72. data/lib/active_record/connection_adapters/column.rb +270 -0
  73. data/lib/active_record/connection_adapters/mysql2_adapter.rb +288 -0
  74. data/lib/active_record/connection_adapters/mysql_adapter.rb +426 -0
  75. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1261 -0
  76. data/lib/active_record/connection_adapters/schema_cache.rb +50 -0
  77. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +55 -0
  78. data/lib/active_record/connection_adapters/sqlite_adapter.rb +577 -0
  79. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  80. data/lib/active_record/counter_cache.rb +119 -0
  81. data/lib/active_record/dynamic_finder_match.rb +56 -0
  82. data/lib/active_record/dynamic_matchers.rb +79 -0
  83. data/lib/active_record/dynamic_scope_match.rb +23 -0
  84. data/lib/active_record/errors.rb +195 -0
  85. data/lib/active_record/explain.rb +85 -0
  86. data/lib/active_record/explain_subscriber.rb +21 -0
  87. data/lib/active_record/fixtures.rb +906 -0
  88. data/lib/active_record/fixtures/file.rb +65 -0
  89. data/lib/active_record/identity_map.rb +156 -0
  90. data/lib/active_record/inheritance.rb +167 -0
  91. data/lib/active_record/integration.rb +49 -0
  92. data/lib/active_record/locale/en.yml +40 -0
  93. data/lib/active_record/locking/optimistic.rb +183 -0
  94. data/lib/active_record/locking/pessimistic.rb +77 -0
  95. data/lib/active_record/log_subscriber.rb +68 -0
  96. data/lib/active_record/migration.rb +765 -0
  97. data/lib/active_record/migration/command_recorder.rb +105 -0
  98. data/lib/active_record/model_schema.rb +366 -0
  99. data/lib/active_record/nested_attributes.rb +469 -0
  100. data/lib/active_record/observer.rb +121 -0
  101. data/lib/active_record/persistence.rb +372 -0
  102. data/lib/active_record/query_cache.rb +74 -0
  103. data/lib/active_record/querying.rb +58 -0
  104. data/lib/active_record/railtie.rb +119 -0
  105. data/lib/active_record/railties/console_sandbox.rb +6 -0
  106. data/lib/active_record/railties/controller_runtime.rb +49 -0
  107. data/lib/active_record/railties/databases.rake +620 -0
  108. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  109. data/lib/active_record/readonly_attributes.rb +26 -0
  110. data/lib/active_record/reflection.rb +534 -0
  111. data/lib/active_record/relation.rb +534 -0
  112. data/lib/active_record/relation/batches.rb +90 -0
  113. data/lib/active_record/relation/calculations.rb +354 -0
  114. data/lib/active_record/relation/delegation.rb +49 -0
  115. data/lib/active_record/relation/finder_methods.rb +398 -0
  116. data/lib/active_record/relation/predicate_builder.rb +58 -0
  117. data/lib/active_record/relation/query_methods.rb +417 -0
  118. data/lib/active_record/relation/spawn_methods.rb +148 -0
  119. data/lib/active_record/result.rb +34 -0
  120. data/lib/active_record/sanitization.rb +194 -0
  121. data/lib/active_record/schema.rb +58 -0
  122. data/lib/active_record/schema_dumper.rb +204 -0
  123. data/lib/active_record/scoping.rb +152 -0
  124. data/lib/active_record/scoping/default.rb +142 -0
  125. data/lib/active_record/scoping/named.rb +202 -0
  126. data/lib/active_record/serialization.rb +18 -0
  127. data/lib/active_record/serializers/xml_serializer.rb +202 -0
  128. data/lib/active_record/session_store.rb +358 -0
  129. data/lib/active_record/store.rb +50 -0
  130. data/lib/active_record/test_case.rb +73 -0
  131. data/lib/active_record/timestamp.rb +113 -0
  132. data/lib/active_record/transactions.rb +360 -0
  133. data/lib/active_record/translation.rb +22 -0
  134. data/lib/active_record/validations.rb +83 -0
  135. data/lib/active_record/validations/associated.rb +43 -0
  136. data/lib/active_record/validations/uniqueness.rb +180 -0
  137. data/lib/active_record/version.rb +10 -0
  138. data/lib/rails/generators/active_record.rb +25 -0
  139. data/lib/rails/generators/active_record/migration.rb +15 -0
  140. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  141. data/lib/rails/generators/active_record/migration/templates/migration.rb +31 -0
  142. data/lib/rails/generators/active_record/model/model_generator.rb +43 -0
  143. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  144. data/lib/rails/generators/active_record/model/templates/model.rb +7 -0
  145. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  146. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  147. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  148. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  149. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  150. metadata +242 -0
@@ -0,0 +1,34 @@
1
+ module ActiveRecord
2
+ # = Active Record Belongs To Polymorphic Association
3
+ module Associations
4
+ class BelongsToPolymorphicAssociation < BelongsToAssociation #:nodoc:
5
+ def klass
6
+ type = owner[reflection.foreign_type]
7
+ type.presence && type.constantize
8
+ end
9
+
10
+ private
11
+
12
+ def replace_keys(record)
13
+ super
14
+ owner[reflection.foreign_type] = record && record.class.base_class.name
15
+ end
16
+
17
+ def different_target?(record)
18
+ super || record.class != klass
19
+ end
20
+
21
+ def inverse_reflection_for(record)
22
+ reflection.polymorphic_inverse_of(record.class)
23
+ end
24
+
25
+ def raise_on_type_mismatch(record)
26
+ # A polymorphic association cannot have a type mismatch, by definition
27
+ end
28
+
29
+ def stale_state
30
+ [super, owner[reflection.foreign_type].to_s]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,55 @@
1
+ module ActiveRecord::Associations::Builder
2
+ class Association #:nodoc:
3
+ class_attribute :valid_options
4
+ self.valid_options = [:class_name, :foreign_key, :select, :conditions, :include, :extend, :readonly, :validate]
5
+
6
+ # Set by subclasses
7
+ class_attribute :macro
8
+
9
+ attr_reader :model, :name, :options, :reflection
10
+
11
+ def self.build(model, name, options)
12
+ new(model, name, options).build
13
+ end
14
+
15
+ def initialize(model, name, options)
16
+ @model, @name, @options = model, name, options
17
+ end
18
+
19
+ def mixin
20
+ @model.generated_feature_methods
21
+ end
22
+
23
+ def build
24
+ validate_options
25
+ reflection = model.create_reflection(self.class.macro, name, options, model)
26
+ define_accessors
27
+ reflection
28
+ end
29
+
30
+ private
31
+
32
+ def validate_options
33
+ options.assert_valid_keys(self.class.valid_options)
34
+ end
35
+
36
+ def define_accessors
37
+ define_readers
38
+ define_writers
39
+ end
40
+
41
+ def define_readers
42
+ name = self.name
43
+ mixin.redefine_method(name) do |*params|
44
+ association(name).reader(*params)
45
+ end
46
+ end
47
+
48
+ def define_writers
49
+ name = self.name
50
+ mixin.redefine_method("#{name}=") do |value|
51
+ association(name).writer(value)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,85 @@
1
+ require 'active_support/core_ext/object/inclusion'
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class BelongsTo < SingularAssociation #:nodoc:
5
+ self.macro = :belongs_to
6
+
7
+ self.valid_options += [:foreign_type, :polymorphic, :touch]
8
+
9
+ def constructable?
10
+ !options[:polymorphic]
11
+ end
12
+
13
+ def build
14
+ reflection = super
15
+ add_counter_cache_callbacks(reflection) if options[:counter_cache]
16
+ add_touch_callbacks(reflection) if options[:touch]
17
+ configure_dependency
18
+ reflection
19
+ end
20
+
21
+ private
22
+
23
+ def add_counter_cache_callbacks(reflection)
24
+ cache_column = reflection.counter_cache_column
25
+ name = self.name
26
+
27
+ method_name = "belongs_to_counter_cache_after_create_for_#{name}"
28
+ mixin.redefine_method(method_name) do
29
+ record = send(name)
30
+ record.class.increment_counter(cache_column, record.id) unless record.nil?
31
+ end
32
+ model.after_create(method_name)
33
+
34
+ method_name = "belongs_to_counter_cache_before_destroy_for_#{name}"
35
+ mixin.redefine_method(method_name) do
36
+ record = send(name)
37
+ record.class.decrement_counter(cache_column, record.id) unless record.nil?
38
+ end
39
+ model.before_destroy(method_name)
40
+
41
+ model.send(:module_eval,
42
+ "#{reflection.class_name}.send(:attr_readonly,\"#{cache_column}\".intern) if defined?(#{reflection.class_name}) && #{reflection.class_name}.respond_to?(:attr_readonly)", __FILE__, __LINE__
43
+ )
44
+ end
45
+
46
+ def add_touch_callbacks(reflection)
47
+ name = self.name
48
+ method_name = "belongs_to_touch_after_save_or_destroy_for_#{name}"
49
+ touch = options[:touch]
50
+
51
+ mixin.redefine_method(method_name) do
52
+ record = send(name)
53
+
54
+ unless record.nil?
55
+ if touch == true
56
+ record.touch
57
+ else
58
+ record.touch(touch)
59
+ end
60
+ end
61
+ end
62
+
63
+ model.after_save(method_name)
64
+ model.after_touch(method_name)
65
+ model.after_destroy(method_name)
66
+ end
67
+
68
+ def configure_dependency
69
+ if options[:dependent]
70
+ unless options[:dependent].in?([:destroy, :delete])
71
+ raise ArgumentError, "The :dependent option expects either :destroy or :delete (#{options[:dependent].inspect})"
72
+ end
73
+
74
+ method_name = "belongs_to_dependent_#{options[:dependent]}_for_#{name}"
75
+ model.send(:class_eval, <<-eoruby, __FILE__, __LINE__ + 1)
76
+ def #{method_name}
77
+ association = #{name}
78
+ association.#{options[:dependent]} if association
79
+ end
80
+ eoruby
81
+ model.after_destroy method_name
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,75 @@
1
+ module ActiveRecord::Associations::Builder
2
+ class CollectionAssociation < Association #:nodoc:
3
+ CALLBACKS = [:before_add, :after_add, :before_remove, :after_remove]
4
+
5
+ self.valid_options += [
6
+ :table_name, :order, :group, :having, :limit, :offset, :uniq, :finder_sql,
7
+ :counter_sql, :before_add, :after_add, :before_remove, :after_remove
8
+ ]
9
+
10
+ attr_reader :block_extension
11
+
12
+ def self.build(model, name, options, &extension)
13
+ new(model, name, options, &extension).build
14
+ end
15
+
16
+ def initialize(model, name, options, &extension)
17
+ super(model, name, options)
18
+ @block_extension = extension
19
+ end
20
+
21
+ def build
22
+ wrap_block_extension
23
+ reflection = super
24
+ CALLBACKS.each { |callback_name| define_callback(callback_name) }
25
+ reflection
26
+ end
27
+
28
+ def writable?
29
+ true
30
+ end
31
+
32
+ private
33
+
34
+ def wrap_block_extension
35
+ options[:extend] = Array.wrap(options[:extend])
36
+
37
+ if block_extension
38
+ silence_warnings do
39
+ model.parent.const_set(extension_module_name, Module.new(&block_extension))
40
+ end
41
+ options[:extend].push("#{model.parent}::#{extension_module_name}".constantize)
42
+ end
43
+ end
44
+
45
+ def extension_module_name
46
+ @extension_module_name ||= "#{model.to_s.demodulize}#{name.to_s.camelize}AssociationExtension"
47
+ end
48
+
49
+ def define_callback(callback_name)
50
+ full_callback_name = "#{callback_name}_for_#{name}"
51
+
52
+ # TODO : why do i need method_defined? I think its because of the inheritance chain
53
+ model.class_attribute full_callback_name.to_sym unless model.method_defined?(full_callback_name)
54
+ model.send("#{full_callback_name}=", Array.wrap(options[callback_name.to_sym]))
55
+ end
56
+
57
+ def define_readers
58
+ super
59
+
60
+ name = self.name
61
+ mixin.redefine_method("#{name.to_s.singularize}_ids") do
62
+ association(name).ids_reader
63
+ end
64
+ end
65
+
66
+ def define_writers
67
+ super
68
+
69
+ name = self.name
70
+ mixin.redefine_method("#{name.to_s.singularize}_ids=") do |ids|
71
+ association(name).ids_writer(ids)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,57 @@
1
+ module ActiveRecord::Associations::Builder
2
+ class HasAndBelongsToMany < CollectionAssociation #:nodoc:
3
+ self.macro = :has_and_belongs_to_many
4
+
5
+ self.valid_options += [:join_table, :association_foreign_key, :delete_sql, :insert_sql]
6
+
7
+ def build
8
+ reflection = super
9
+ check_validity(reflection)
10
+ define_destroy_hook
11
+ reflection
12
+ end
13
+
14
+ private
15
+
16
+ def define_destroy_hook
17
+ name = self.name
18
+ model.send(:include, Module.new {
19
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
20
+ def destroy_associations
21
+ association(#{name.to_sym.inspect}).delete_all_on_destroy
22
+ super
23
+ end
24
+ RUBY
25
+ })
26
+ end
27
+
28
+ # TODO: These checks should probably be moved into the Reflection, and we should not be
29
+ # redefining the options[:join_table] value - instead we should define a
30
+ # reflection.join_table method.
31
+ def check_validity(reflection)
32
+ if reflection.association_foreign_key == reflection.foreign_key
33
+ raise ActiveRecord::HasAndBelongsToManyAssociationForeignKeyNeeded.new(reflection)
34
+ end
35
+
36
+ reflection.options[:join_table] ||= join_table_name(
37
+ model.send(:undecorated_table_name, model.to_s),
38
+ model.send(:undecorated_table_name, reflection.class_name)
39
+ )
40
+ end
41
+
42
+ # Generates a join table name from two provided table names.
43
+ # The names in the join table names end up in lexicographic order.
44
+ #
45
+ # join_table_name("members", "clubs") # => "clubs_members"
46
+ # join_table_name("members", "special_clubs") # => "members_special_clubs"
47
+ def join_table_name(first_table_name, second_table_name)
48
+ if first_table_name < second_table_name
49
+ join_table = "#{first_table_name}_#{second_table_name}"
50
+ else
51
+ join_table = "#{second_table_name}_#{first_table_name}"
52
+ end
53
+
54
+ model.table_name_prefix + join_table + model.table_name_suffix
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,71 @@
1
+ require 'active_support/core_ext/object/inclusion'
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class HasMany < CollectionAssociation #:nodoc:
5
+ self.macro = :has_many
6
+
7
+ self.valid_options += [:primary_key, :dependent, :as, :through, :source, :source_type, :inverse_of]
8
+
9
+ def build
10
+ reflection = super
11
+ configure_dependency
12
+ reflection
13
+ end
14
+
15
+ private
16
+
17
+ def configure_dependency
18
+ if options[:dependent]
19
+ unless options[:dependent].in?([:destroy, :delete_all, :nullify, :restrict])
20
+ raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, " \
21
+ ":nullify or :restrict (#{options[:dependent].inspect})"
22
+ end
23
+
24
+ send("define_#{options[:dependent]}_dependency_method")
25
+ model.before_destroy dependency_method_name
26
+ end
27
+ end
28
+
29
+ def define_destroy_dependency_method
30
+ name = self.name
31
+ mixin.redefine_method(dependency_method_name) do
32
+ send(name).each do |o|
33
+ # No point in executing the counter update since we're going to destroy the parent anyway
34
+ counter_method = ('belongs_to_counter_cache_before_destroy_for_' + self.class.name.downcase).to_sym
35
+ if o.respond_to?(counter_method)
36
+ class << o
37
+ self
38
+ end.send(:define_method, counter_method, Proc.new {})
39
+ end
40
+ end
41
+
42
+ send(name).delete_all
43
+ end
44
+ end
45
+
46
+ def define_delete_all_dependency_method
47
+ name = self.name
48
+ mixin.redefine_method(dependency_method_name) do
49
+ association(name).delete_all_on_destroy
50
+ end
51
+ end
52
+
53
+ def define_nullify_dependency_method
54
+ name = self.name
55
+ mixin.redefine_method(dependency_method_name) do
56
+ send(name).delete_all
57
+ end
58
+ end
59
+
60
+ def define_restrict_dependency_method
61
+ name = self.name
62
+ mixin.redefine_method(dependency_method_name) do
63
+ raise ActiveRecord::DeleteRestrictionError.new(name) unless send(name).empty?
64
+ end
65
+ end
66
+
67
+ def dependency_method_name
68
+ "has_many_dependent_for_#{name}"
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,62 @@
1
+ require 'active_support/core_ext/object/inclusion'
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class HasOne < SingularAssociation #:nodoc:
5
+ self.macro = :has_one
6
+
7
+ self.valid_options += [:order, :as]
8
+
9
+ class_attribute :through_options
10
+ self.through_options = [:through, :source, :source_type]
11
+
12
+ def constructable?
13
+ !options[:through]
14
+ end
15
+
16
+ def build
17
+ reflection = super
18
+ configure_dependency unless options[:through]
19
+ reflection
20
+ end
21
+
22
+ private
23
+
24
+ def validate_options
25
+ valid_options = self.class.valid_options
26
+ valid_options += self.class.through_options if options[:through]
27
+ options.assert_valid_keys(valid_options)
28
+ end
29
+
30
+ def configure_dependency
31
+ if options[:dependent]
32
+ unless options[:dependent].in?([:destroy, :delete, :nullify, :restrict])
33
+ raise ArgumentError, "The :dependent option expects either :destroy, :delete, " \
34
+ ":nullify or :restrict (#{options[:dependent].inspect})"
35
+ end
36
+
37
+ send("define_#{options[:dependent]}_dependency_method")
38
+ model.before_destroy dependency_method_name
39
+ end
40
+ end
41
+
42
+ def dependency_method_name
43
+ "has_one_dependent_#{options[:dependent]}_for_#{name}"
44
+ end
45
+
46
+ def define_destroy_dependency_method
47
+ name = self.name
48
+ mixin.redefine_method(dependency_method_name) do
49
+ association(name).delete
50
+ end
51
+ end
52
+ alias :define_delete_dependency_method :define_destroy_dependency_method
53
+ alias :define_nullify_dependency_method :define_destroy_dependency_method
54
+
55
+ def define_restrict_dependency_method
56
+ name = self.name
57
+ mixin.redefine_method(dependency_method_name) do
58
+ raise ActiveRecord::DeleteRestrictionError.new(name) unless send(name).nil?
59
+ end
60
+ end
61
+ end
62
+ end