composite_primary_keys 7.0.16 → 8.0.0

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +600 -623
  3. data/lib/composite_primary_keys.rb +113 -115
  4. data/lib/composite_primary_keys/associations/association.rb +23 -23
  5. data/lib/composite_primary_keys/associations/association_scope.rb +73 -77
  6. data/lib/composite_primary_keys/associations/collection_association.rb +15 -0
  7. data/lib/composite_primary_keys/associations/has_many_association.rb +69 -56
  8. data/lib/composite_primary_keys/associations/has_many_through_association.rb +30 -28
  9. data/lib/composite_primary_keys/associations/join_dependency.rb +87 -89
  10. data/lib/composite_primary_keys/associations/join_dependency/join_association.rb +22 -22
  11. data/lib/composite_primary_keys/associations/preloader/association.rb +90 -78
  12. data/lib/composite_primary_keys/associations/preloader/belongs_to.rb +19 -19
  13. data/lib/composite_primary_keys/associations/singular_association.rb +15 -0
  14. data/lib/composite_primary_keys/attribute_methods.rb +9 -0
  15. data/lib/composite_primary_keys/attribute_methods/dirty.rb +29 -26
  16. data/lib/composite_primary_keys/attribute_methods/read.rb +19 -34
  17. data/lib/composite_primary_keys/attribute_methods/write.rb +30 -36
  18. data/lib/composite_primary_keys/attribute_set/builder.rb +20 -0
  19. data/lib/composite_primary_keys/base.rb +135 -129
  20. data/lib/composite_primary_keys/composite_arrays.rb +30 -30
  21. data/lib/composite_primary_keys/composite_predicates.rb +50 -50
  22. data/lib/composite_primary_keys/composite_relation.rb +48 -48
  23. data/lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb +2 -4
  24. data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +46 -60
  25. data/lib/composite_primary_keys/core.rb +69 -47
  26. data/lib/composite_primary_keys/fixtures.rb +22 -22
  27. data/lib/composite_primary_keys/persistence.rb +56 -60
  28. data/lib/composite_primary_keys/relation.rb +68 -56
  29. data/lib/composite_primary_keys/relation/calculations.rb +79 -75
  30. data/lib/composite_primary_keys/relation/finder_methods.rb +175 -196
  31. data/lib/composite_primary_keys/relation/query_methods.rb +40 -40
  32. data/lib/composite_primary_keys/sanitization.rb +52 -52
  33. data/lib/composite_primary_keys/validations/uniqueness.rb +36 -37
  34. data/lib/composite_primary_keys/version.rb +8 -8
  35. data/tasks/databases/oracle.rake +25 -25
  36. data/tasks/databases/sqlserver.rake +27 -40
  37. data/test/abstract_unit.rb +113 -113
  38. data/test/connections/databases.ci.yml +15 -15
  39. data/test/connections/databases.example.yml +18 -18
  40. data/test/connections/native_oracle/connection.rb +11 -11
  41. data/test/connections/native_oracle_enhanced/connection.rb +16 -16
  42. data/test/connections/native_sqlserver/connection.rb +11 -14
  43. data/test/fixtures/comment.rb +7 -7
  44. data/test/fixtures/db_definitions/db2-create-tables.sql +125 -126
  45. data/test/fixtures/db_definitions/db2-drop-tables.sql +18 -18
  46. data/test/fixtures/db_definitions/mysql.sql +207 -208
  47. data/test/fixtures/db_definitions/oracle.drop.sql +45 -45
  48. data/test/fixtures/db_definitions/oracle.sql +222 -223
  49. data/test/fixtures/db_definitions/postgresql.sql +209 -210
  50. data/test/fixtures/db_definitions/sqlite.sql +196 -197
  51. data/test/fixtures/db_definitions/sqlserver.drop.sql +91 -94
  52. data/test/fixtures/db_definitions/sqlserver.sql +225 -232
  53. data/test/fixtures/dorm.rb +2 -2
  54. data/test/fixtures/employee.rb +5 -5
  55. data/test/fixtures/membership.rb +6 -6
  56. data/test/fixtures/membership_statuses.yml +16 -16
  57. data/test/fixtures/memberships.yml +10 -10
  58. data/test/fixtures/product_tariffs.yml +14 -14
  59. data/test/fixtures/reference_code.rb +7 -7
  60. data/test/fixtures/restaurants_suburb.rb +2 -2
  61. data/test/fixtures/suburb.rb +5 -5
  62. data/test/fixtures/topic.rb +5 -5
  63. data/test/fixtures/topic_source.rb +6 -6
  64. data/test/fixtures/topic_sources.yml +3 -3
  65. data/test/fixtures/topics.yml +8 -8
  66. data/test/fixtures/users.yml +10 -10
  67. data/test/test_associations.rb +295 -275
  68. data/test/test_attribute_methods.rb +63 -63
  69. data/test/test_attributes.rb +60 -60
  70. data/test/test_calculations.rb +37 -42
  71. data/test/test_callbacks.rb +99 -99
  72. data/test/test_create.rb +112 -112
  73. data/test/test_delete.rb +148 -152
  74. data/test/test_delete_all.rb +28 -26
  75. data/test/test_dumpable.rb +15 -15
  76. data/test/test_enum.rb +21 -20
  77. data/test/test_equal.rb +26 -26
  78. data/test/test_find.rb +118 -118
  79. data/test/test_habtm.rb +113 -113
  80. data/test/test_nested_attributes.rb +124 -124
  81. data/test/test_polymorphic.rb +26 -26
  82. data/test/test_predicates.rb +40 -40
  83. data/test/test_santiago.rb +23 -23
  84. data/test/test_suite.rb +33 -34
  85. data/test/test_touch.rb +23 -23
  86. data/test/test_tutorial_example.rb +21 -21
  87. data/test/test_update.rb +71 -71
  88. metadata +9 -13
  89. data/lib/composite_primary_keys/arel/visitors/to_sql.rb +0 -20
  90. data/lib/composite_primary_keys/associations/has_and_belongs_to_many_association.rb +0 -59
  91. data/lib/composite_primary_keys/associations/join_dependency/join_part.rb +0 -39
  92. data/lib/composite_primary_keys/associations/preloader/has_and_belongs_to_many.rb +0 -46
  93. data/lib/composite_primary_keys/connection_adapters/sqlserver_adapter.rb +0 -17
  94. data/lib/composite_primary_keys/locking/optimistic.rb +0 -55
  95. data/test/test_optimistic.rb +0 -18
@@ -1,46 +0,0 @@
1
- module ActiveRecord
2
- module Associations
3
- class Preloader
4
- class HasAndBelongsToMany
5
- def records_for(ids)
6
- # CPK
7
- # scope = super
8
- predicate = cpk_in_predicate(join_table, reflection.foreign_key, ids)
9
- scope = build_scope.where(predicate)
10
-
11
- klass.connection.select_all(scope.arel.to_sql, 'SQL', scope.bind_values)
12
- end
13
-
14
- def join
15
- # CPK
16
- #condition = table[reflection.association_primary_key].eq(
17
- # join_table[reflection.association_foreign_key])
18
- condition = cpk_join_predicate(table, reflection.association_primary_key,
19
- join_table, reflection.association_foreign_key)
20
-
21
- table.create_join(join_table, table.create_on(condition))
22
- end
23
-
24
- def association_key_alias(field)
25
- "ar_association_key_name_#{field.to_s}"
26
- end
27
-
28
- def join_select
29
- # CPK
30
- # association_key.as(Arel.sql(association_key_name))
31
- Array(reflection.foreign_key).map do |key|
32
- join_table[key].as(Arel.sql(association_key_alias(key)))
33
- end
34
- end
35
-
36
- def association_key_name
37
- # CPK
38
- # 'ar_association_key_name'
39
- Array(reflection.foreign_key).map do |key|
40
- association_key_alias(key)
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,17 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- class SQLServerAdapter
4
- def sql_for_insert(sql, pk, id_value, sequence_name, binds)
5
- sql =
6
- if pk
7
- # support composite primary keys consisting of more than one column name
8
- inserted_pks = [pk].flatten.map {|pk| "inserted.#{pk}"}
9
- sql.insert(sql.index(/ (DEFAULT )?VALUES/), " OUTPUT #{inserted_pks.join(", ")}")
10
- else
11
- "#{sql}; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident"
12
- end
13
- [sql, binds]
14
- end
15
- end
16
- end
17
- end
@@ -1,55 +0,0 @@
1
- module ActiveRecord
2
- module Locking
3
- module Optimistic
4
- private
5
- def _update_record(attribute_names = @attributes.keys) #:nodoc:
6
- return super unless locking_enabled?
7
- return 0 if attribute_names.empty?
8
-
9
- lock_col = self.class.locking_column
10
- previous_lock_value = send(lock_col).to_i
11
- increment_lock
12
-
13
- attribute_names += [lock_col]
14
- attribute_names.uniq!
15
-
16
- begin
17
- relation = self.class.unscoped
18
-
19
- if self.composite?
20
- stmt = relation.where(
21
- relation.cpk_id_predicate(relation.table, self.class.primary_key, id_was).and(
22
- relation.table[lock_col].eq(self.class.quote_value(previous_lock_value, column_for_attribute(lock_col)))
23
- )
24
- ).arel.compile_update(
25
- arel_attributes_with_values_for_update(attribute_names),
26
- self.class.primary_key
27
- )
28
- else
29
- stmt = relation.where(
30
- relation.table[self.class.primary_key].eq(id).and(
31
- relation.table[lock_col].eq(self.class.quote_value(previous_lock_value, column_for_attribute(lock_col)))
32
- )
33
- ).arel.compile_update(
34
- arel_attributes_with_values_for_update(attribute_names),
35
- self.class.primary_key
36
- )
37
- end
38
-
39
- affected_rows = self.class.connection.update stmt
40
-
41
- unless affected_rows == 1
42
- raise ActiveRecord::StaleObjectError.new(self, "update")
43
- end
44
-
45
- affected_rows
46
-
47
- # If something went wrong, revert the version.
48
- rescue Exception
49
- send(lock_col + '=', previous_lock_value)
50
- raise
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,18 +0,0 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestOptimisitic < ActiveSupport::TestCase
4
- fixtures :restaurants
5
-
6
- def test_update_with_stale_error
7
- restaurant_1 = Restaurant.find([1, 1])
8
- restaurant_1['name'] = "McDonalds renamed"
9
-
10
- restaurant_2 = Restaurant.find([1, 1])
11
- restaurant_2['name'] = "McDonalds renamed 2"
12
-
13
- assert(restaurant_1.save)
14
- assert_raise ActiveRecord::StaleObjectError do
15
- restaurant_2.save
16
- end
17
- end
18
- end