composite_primary_keys 8.1.8 → 9.0.0.beta1
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.
- checksums.yaml +5 -5
- data/History.rdoc +3 -25
- data/README.rdoc +1 -0
- data/README_DB2.rdoc +33 -33
- data/Rakefile +34 -34
- data/lib/composite_primary_keys.rb +4 -11
- data/lib/composite_primary_keys/associations/association.rb +14 -12
- data/lib/composite_primary_keys/associations/association_scope.rb +27 -54
- data/lib/composite_primary_keys/associations/collection_association.rb +22 -8
- data/lib/composite_primary_keys/associations/has_many_association.rb +16 -54
- data/lib/composite_primary_keys/associations/has_many_through_association.rb +58 -58
- data/lib/composite_primary_keys/associations/join_dependency.rb +74 -56
- data/lib/composite_primary_keys/associations/join_dependency/join_association.rb +13 -11
- data/lib/composite_primary_keys/associations/preloader/association.rb +75 -72
- data/lib/composite_primary_keys/associations/singular_association.rb +8 -12
- data/lib/composite_primary_keys/attribute_methods.rb +6 -4
- data/lib/composite_primary_keys/attribute_methods/primary_key.rb +13 -11
- data/lib/composite_primary_keys/attribute_methods/read.rb +16 -15
- data/lib/composite_primary_keys/attribute_methods/write.rb +21 -19
- data/lib/composite_primary_keys/attribute_set/builder.rb +13 -11
- data/lib/composite_primary_keys/base.rb +5 -69
- data/lib/composite_primary_keys/composite_arrays.rb +8 -51
- data/lib/composite_primary_keys/composite_predicates.rb +7 -16
- data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +42 -11
- data/lib/composite_primary_keys/core.rb +46 -45
- data/lib/composite_primary_keys/dirty.rb +19 -19
- data/lib/composite_primary_keys/fixtures.rb +19 -17
- data/lib/composite_primary_keys/locking/optimistic.rb +48 -44
- data/lib/composite_primary_keys/nested_attributes.rb +64 -53
- data/lib/composite_primary_keys/persistence.rb +49 -41
- data/lib/composite_primary_keys/relation.rb +22 -47
- data/lib/composite_primary_keys/relation/batches.rb +33 -30
- data/lib/composite_primary_keys/relation/calculations.rb +3 -7
- data/lib/composite_primary_keys/relation/finder_methods.rb +123 -56
- data/lib/composite_primary_keys/relation/predicate_builder.rb +18 -29
- data/lib/composite_primary_keys/relation/where_clause.rb +33 -0
- data/lib/composite_primary_keys/sanitization.rb +45 -38
- data/lib/composite_primary_keys/validations/uniqueness.rb +37 -37
- data/lib/composite_primary_keys/version.rb +4 -4
- data/scripts/console.rb +48 -48
- data/scripts/txt2html +76 -76
- data/scripts/txt2js +65 -65
- data/tasks/databases/mysql.rake +42 -42
- data/tasks/databases/postgresql.rake +47 -47
- data/tasks/databases/sqlite3.rake +27 -27
- data/tasks/website.rake +18 -18
- data/test/README_tests.rdoc +56 -56
- data/test/abstract_unit.rb +10 -9
- data/test/connections/connection_spec.rb +18 -18
- data/test/connections/databases.yml +9 -39
- data/test/connections/native_ibm_db/connection.rb +18 -18
- data/test/connections/native_mysql/connection.rb +17 -17
- data/test/connections/native_postgresql/connection.rb +12 -12
- data/test/connections/native_sqlite3/connection.rb +9 -9
- data/test/db_test.rb +52 -52
- data/test/fixtures/article.rb +5 -5
- data/test/fixtures/articles.yml +6 -6
- data/test/fixtures/capitol.rb +3 -3
- data/test/fixtures/capitols.yml +16 -16
- data/test/fixtures/comments.yml +15 -15
- data/test/fixtures/db_definitions/mysql.sql +2 -12
- data/test/fixtures/db_definitions/oracle.sql +1 -2
- data/test/fixtures/db_definitions/postgresql.sql +0 -10
- data/test/fixtures/db_definitions/sqlite.sql +0 -9
- data/test/fixtures/db_definitions/sqlserver.sql +1 -2
- data/test/fixtures/department.rb +5 -5
- data/test/fixtures/departments.yml +15 -15
- data/test/fixtures/dorms.yml +4 -4
- data/test/fixtures/employee.rb +1 -2
- data/test/fixtures/employees.yml +19 -23
- data/test/fixtures/group.rb +2 -2
- data/test/fixtures/groups.yml +6 -6
- data/test/fixtures/hack.rb +4 -4
- data/test/fixtures/hacks.yml +2 -2
- data/test/fixtures/membership_status.rb +2 -2
- data/test/fixtures/product.rb +9 -9
- data/test/fixtures/product_tariff.rb +5 -5
- data/test/fixtures/products.yml +11 -11
- data/test/fixtures/reading.rb +4 -4
- data/test/fixtures/readings.yml +10 -10
- data/test/fixtures/reference_code_using_composite_key_alias.rb +8 -8
- data/test/fixtures/reference_code_using_simple_key_alias.rb +8 -8
- data/test/fixtures/reference_codes.yml +28 -28
- data/test/fixtures/reference_type.rb +1 -1
- data/test/fixtures/reference_types.yml +9 -9
- data/test/fixtures/restaurant.rb +9 -9
- data/test/fixtures/restaurants.yml +14 -14
- data/test/fixtures/restaurants_suburbs.yml +10 -10
- data/test/fixtures/room.rb +11 -11
- data/test/fixtures/room_assignment.rb +13 -13
- data/test/fixtures/room_assignments.yml +24 -24
- data/test/fixtures/room_attribute.rb +2 -2
- data/test/fixtures/room_attribute_assignment.rb +4 -4
- data/test/fixtures/room_attribute_assignments.yml +4 -4
- data/test/fixtures/room_attributes.yml +2 -2
- data/test/fixtures/rooms.yml +12 -12
- data/test/fixtures/seat.rb +5 -5
- data/test/fixtures/seats.yml +8 -8
- data/test/fixtures/street.rb +2 -2
- data/test/fixtures/streets.yml +16 -16
- data/test/fixtures/student.rb +3 -3
- data/test/fixtures/students.yml +15 -15
- data/test/fixtures/suburbs.yml +14 -14
- data/test/fixtures/tariff.rb +5 -5
- data/test/fixtures/tariffs.yml +14 -14
- data/test/fixtures/user.rb +0 -1
- data/test/plugins/pagination.rb +405 -405
- data/test/plugins/pagination_helper.rb +135 -135
- data/test/setup.rb +50 -50
- data/test/test_aliases.rb +18 -18
- data/test/test_associations.rb +7 -18
- data/test/test_composite_arrays.rb +24 -38
- data/test/test_counter_cache.rb +30 -30
- data/test/test_create.rb +5 -5
- data/test/test_delete_all.rb +7 -13
- data/test/test_dup.rb +37 -37
- data/test/test_exists.rb +39 -39
- data/test/test_find.rb +16 -12
- data/test/test_habtm.rb +26 -2
- data/test/test_ids.rb +109 -116
- data/test/test_miscellaneous.rb +32 -32
- data/test/test_pagination.rb +35 -35
- data/test/test_polymorphic.rb +0 -7
- data/test/test_predicates.rb +9 -28
- data/test/test_update.rb +3 -5
- data/test/test_validations.rb +13 -13
- metadata +24 -32
- data/lib/composite_primary_keys/arel/visitors/to_sql.rb +0 -36
- data/lib/composite_primary_keys/attribute_methods/dirty.rb +0 -29
- data/lib/composite_primary_keys/autosave_association.rb +0 -67
- data/lib/composite_primary_keys/connection_adapters/abstract_mysql_adapter.rb +0 -23
- data/test/fixtures/pk_called_id.rb +0 -5
- data/test/fixtures/pk_called_ids.yml +0 -11
- data/test/test_find_in_batches.rb +0 -30
- data/test/test_update_all.rb +0 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 2e62c2248e714242837c9bd00862bd0411c02f00
|
|
4
|
+
data.tar.gz: 587c5f4beabb743d14fd3d7febb134d2fdfa3ab5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 82894133f71054b13e6fa8293e968fff35732cddd7b7856749d9b67b40a81798130f66974acb6561e137899feb591119cab35657b4b98eaf892a12a938dd5ccf
|
|
7
|
+
data.tar.gz: d5605252ae0c73bef65b92993562032808e86d6ba192eda0e8c5f12681d9465679ab947b2a76b8a93e8423ef1ae673ce0611f66275d16611e7af9ceb4c8de03e
|
data/History.rdoc
CHANGED
|
@@ -1,28 +1,5 @@
|
|
|
1
|
-
==
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
== 8.1.7 (2019-05-04)
|
|
5
|
-
|
|
6
|
-
Fix key not being an array in subquery on has_many :through (Eric Proulx)
|
|
7
|
-
Convert batches to arrays before continuing loop (Jeremy Mickelson)
|
|
8
|
-
|
|
9
|
-
== 8.1.6 (2017-05-20)
|
|
10
|
-
|
|
11
|
-
Query cache with bind params (ttw)
|
|
12
|
-
Fix TestIds#test_set_ids_string. Sqlite's serial and integer are a bit different (Boris Peterbarg)
|
|
13
|
-
Associations with inverse fix (Boris Peterbarg)
|
|
14
|
-
Fix save_has_one_association and add a test for it (Boris Peterbarg)
|
|
15
|
-
Fix save_belongs_to_association override (Boris Peterbarg)
|
|
16
|
-
Extend approach from #344 to fix autosave for has_one associations as well (Cameron Finucane)
|
|
17
|
-
|
|
18
|
-
== 8.1.5 (2017-01-01)
|
|
19
|
-
|
|
20
|
-
* Don't nest PK twice when looking up id, fixes #319 (Kerey Roper)
|
|
21
|
-
|
|
22
|
-
== 8.1.4 (2016-07-27)
|
|
23
|
-
|
|
24
|
-
* Create OR predicates in a nicely balanced tree fixing #320 (Nathan Samson)
|
|
25
|
-
* Fix find in batches (apurvis)
|
|
1
|
+
== 9.0.0.beta1 (2015-08-04)
|
|
2
|
+
* Rails 5 support (Sammy Larbi)
|
|
26
3
|
|
|
27
4
|
== 8.1.3 (2016-04-16)
|
|
28
5
|
|
|
@@ -46,6 +23,7 @@ Extend approach from #344 to fix autosave for has_one associations as well (Came
|
|
|
46
23
|
* Remove call to verify_active_connections! which was removed from AR 4.1 (Steve Pletcher)
|
|
47
24
|
* Aligned the establish connection paramater handling to be similar to latest version of rails (Harish Shetty)
|
|
48
25
|
|
|
26
|
+
|
|
49
27
|
== 8.1.0 (2014-03-23)
|
|
50
28
|
|
|
51
29
|
* ActiveRecord 4.2.1 support (Charlie Savage)
|
data/README.rdoc
CHANGED
|
@@ -20,6 +20,7 @@ Every major version of ActiveRecord has included numerous internal changes. As
|
|
|
20
20
|
CPK has to be rewritten for each version of ActiveRecord. To help keep
|
|
21
21
|
things straight, here is the mapping:
|
|
22
22
|
|
|
23
|
+
Version 9.x is designed to work with ActiveRecord 5.0.x
|
|
23
24
|
Version 8.x is designed to work with ActiveRecord 4.2.x
|
|
24
25
|
Version 7.x is designed to work with ActiveRecord 4.1.x
|
|
25
26
|
Version 6.x is designed to work with ActiveRecord 4.0.x
|
data/README_DB2.rdoc
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
Composite Primary key support for db2
|
|
2
|
-
|
|
3
|
-
== Driver Support
|
|
4
|
-
|
|
5
|
-
DB2 support requires the IBM_DB driver provided by http://rubyforge.org/projects/rubyibm/
|
|
6
|
-
project. Install using gem install ibm_db. Tested against version 0.60 of the driver.
|
|
7
|
-
This rubyforge project appears to be permenant location for the IBM adapter.
|
|
8
|
-
Older versions of the driver available from IBM Alphaworks will not work.
|
|
9
|
-
|
|
10
|
-
== Driver Bug and workaround provided as part of this plugin
|
|
11
|
-
|
|
12
|
-
Unlike the basic quote routine available for Rails AR, the DB2 adapter's quote
|
|
13
|
-
method doesn't return " column_name = 1 " when string values (integers in string type variable)
|
|
14
|
-
are passed for quoting numeric column. Rather it returns "column_name = '1'.
|
|
15
|
-
DB2 doesn't accept single quoting numeric columns in SQL. Currently, as part of
|
|
16
|
-
this plugin a fix is provided for the DB2 adapter since this plugin does
|
|
17
|
-
pass string values like this. Perhaps a patch should be sent to the DB2 adapter
|
|
18
|
-
project for a permanant fix.
|
|
19
|
-
|
|
20
|
-
== Database Setup
|
|
21
|
-
|
|
22
|
-
Database must be manually created using a separate command. Read the rake task
|
|
23
|
-
for creating tables and change the db name, user and passwords accordingly.
|
|
24
|
-
|
|
25
|
-
== Tested Database Server version
|
|
26
|
-
|
|
27
|
-
This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
|
|
28
|
-
|
|
29
|
-
== Tested Database Client version
|
|
30
|
-
|
|
31
|
-
This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
|
|
32
|
-
|
|
33
|
-
|
|
1
|
+
Composite Primary key support for db2
|
|
2
|
+
|
|
3
|
+
== Driver Support
|
|
4
|
+
|
|
5
|
+
DB2 support requires the IBM_DB driver provided by http://rubyforge.org/projects/rubyibm/
|
|
6
|
+
project. Install using gem install ibm_db. Tested against version 0.60 of the driver.
|
|
7
|
+
This rubyforge project appears to be permenant location for the IBM adapter.
|
|
8
|
+
Older versions of the driver available from IBM Alphaworks will not work.
|
|
9
|
+
|
|
10
|
+
== Driver Bug and workaround provided as part of this plugin
|
|
11
|
+
|
|
12
|
+
Unlike the basic quote routine available for Rails AR, the DB2 adapter's quote
|
|
13
|
+
method doesn't return " column_name = 1 " when string values (integers in string type variable)
|
|
14
|
+
are passed for quoting numeric column. Rather it returns "column_name = '1'.
|
|
15
|
+
DB2 doesn't accept single quoting numeric columns in SQL. Currently, as part of
|
|
16
|
+
this plugin a fix is provided for the DB2 adapter since this plugin does
|
|
17
|
+
pass string values like this. Perhaps a patch should be sent to the DB2 adapter
|
|
18
|
+
project for a permanant fix.
|
|
19
|
+
|
|
20
|
+
== Database Setup
|
|
21
|
+
|
|
22
|
+
Database must be manually created using a separate command. Read the rake task
|
|
23
|
+
for creating tables and change the db name, user and passwords accordingly.
|
|
24
|
+
|
|
25
|
+
== Tested Database Server version
|
|
26
|
+
|
|
27
|
+
This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
|
|
28
|
+
|
|
29
|
+
== Tested Database Client version
|
|
30
|
+
|
|
31
|
+
This is tested against DB2 v9.1 in Ubuntu Feisty Fawn (7.04)
|
|
32
|
+
|
|
33
|
+
|
data/Rakefile
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
|
-
require 'rake'
|
|
3
|
-
require 'rake/clean'
|
|
4
|
-
require 'rake/testtask'
|
|
5
|
-
require 'rubygems/package_task'
|
|
6
|
-
|
|
7
|
-
# Set global variable so other tasks can access them
|
|
8
|
-
::PROJECT_ROOT = File.expand_path(".")
|
|
9
|
-
::GEM_NAME = 'composite_primary_keys'
|
|
10
|
-
|
|
11
|
-
# Read the spec file
|
|
12
|
-
spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
|
|
13
|
-
|
|
14
|
-
# Setup Rake tasks for managing the gem
|
|
15
|
-
Gem::PackageTask.new(spec).define
|
|
16
|
-
|
|
17
|
-
# Now load in other task files
|
|
18
|
-
Dir.glob('tasks/**/*.rake').each do |rake_file|
|
|
19
|
-
load File.join(File.dirname(__FILE__), rake_file)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Set up test tasks for each supported connection adapter
|
|
23
|
-
%w(mysql sqlite3 oracle oracle_enhanced postgresql ibm_db sqlserver).each do |adapter|
|
|
24
|
-
namespace adapter do
|
|
25
|
-
desc "Run tests using the #{adapter} adapter"
|
|
26
|
-
task "test" do
|
|
27
|
-
ENV["ADAPTER"] = adapter
|
|
28
|
-
Rake::TestTask.new("subtest_#{adapter}") do |t|
|
|
29
|
-
t.libs << "test"
|
|
30
|
-
end
|
|
31
|
-
Rake::Task["subtest_#{adapter}"].invoke
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rake'
|
|
3
|
+
require 'rake/clean'
|
|
4
|
+
require 'rake/testtask'
|
|
5
|
+
require 'rubygems/package_task'
|
|
6
|
+
|
|
7
|
+
# Set global variable so other tasks can access them
|
|
8
|
+
::PROJECT_ROOT = File.expand_path(".")
|
|
9
|
+
::GEM_NAME = 'composite_primary_keys'
|
|
10
|
+
|
|
11
|
+
# Read the spec file
|
|
12
|
+
spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
|
|
13
|
+
|
|
14
|
+
# Setup Rake tasks for managing the gem
|
|
15
|
+
Gem::PackageTask.new(spec).define
|
|
16
|
+
|
|
17
|
+
# Now load in other task files
|
|
18
|
+
Dir.glob('tasks/**/*.rake').each do |rake_file|
|
|
19
|
+
load File.join(File.dirname(__FILE__), rake_file)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Set up test tasks for each supported connection adapter
|
|
23
|
+
%w(mysql sqlite3 oracle oracle_enhanced postgresql ibm_db sqlserver).each do |adapter|
|
|
24
|
+
namespace adapter do
|
|
25
|
+
desc "Run tests using the #{adapter} adapter"
|
|
26
|
+
task "test" do
|
|
27
|
+
ENV["ADAPTER"] = adapter
|
|
28
|
+
Rake::TestTask.new("subtest_#{adapter}") do |t|
|
|
29
|
+
t.libs << "test"
|
|
30
|
+
end
|
|
31
|
+
Rake::Task["subtest_#{adapter}"].invoke
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -26,13 +26,10 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
|
26
26
|
|
|
27
27
|
unless defined?(ActiveRecord)
|
|
28
28
|
require 'rubygems'
|
|
29
|
-
gem 'activerecord', '~>
|
|
29
|
+
gem 'activerecord', '~>5.0.0.beta3'
|
|
30
30
|
require 'active_record'
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
# Arel files we override
|
|
34
|
-
require 'arel/visitors/to_sql'
|
|
35
|
-
|
|
36
33
|
# AR files we override
|
|
37
34
|
require 'active_record/counter_cache'
|
|
38
35
|
require 'active_record/fixtures'
|
|
@@ -61,19 +58,17 @@ require 'active_record/locking/optimistic'
|
|
|
61
58
|
require 'active_record/nested_attributes'
|
|
62
59
|
|
|
63
60
|
require 'active_record/connection_adapters/abstract_adapter'
|
|
64
|
-
require 'active_record/connection_adapters/abstract_mysql_adapter'
|
|
65
61
|
|
|
66
62
|
require 'active_record/relation/batches'
|
|
63
|
+
require 'active_record/relation/where_clause'
|
|
67
64
|
require 'active_record/relation/calculations'
|
|
68
65
|
require 'active_record/relation/finder_methods'
|
|
69
66
|
require 'active_record/relation/predicate_builder'
|
|
70
67
|
require 'active_record/relation/query_methods'
|
|
71
68
|
|
|
72
|
-
require 'active_record/validations/uniqueness'
|
|
69
|
+
require 'active_record/validations/uniqueness' unless ENV["TESTING_CPK"] == "true"
|
|
73
70
|
|
|
74
71
|
# CPK files
|
|
75
|
-
require 'composite_primary_keys/arel/visitors/to_sql'
|
|
76
|
-
|
|
77
72
|
require 'composite_primary_keys/persistence'
|
|
78
73
|
require 'composite_primary_keys/base'
|
|
79
74
|
require 'composite_primary_keys/core'
|
|
@@ -98,20 +93,18 @@ require 'composite_primary_keys/associations/singular_association'
|
|
|
98
93
|
require 'composite_primary_keys/associations/collection_association'
|
|
99
94
|
|
|
100
95
|
require 'composite_primary_keys/dirty'
|
|
101
|
-
require 'composite_primary_keys/autosave_association'
|
|
102
96
|
|
|
103
97
|
require 'composite_primary_keys/attribute_methods/primary_key'
|
|
104
|
-
require 'composite_primary_keys/attribute_methods/dirty'
|
|
105
98
|
require 'composite_primary_keys/attribute_methods/read'
|
|
106
99
|
require 'composite_primary_keys/attribute_methods/write'
|
|
107
100
|
require 'composite_primary_keys/locking/optimistic'
|
|
108
101
|
require 'composite_primary_keys/nested_attributes'
|
|
109
102
|
|
|
110
103
|
require 'composite_primary_keys/connection_adapters/abstract_adapter'
|
|
111
|
-
require 'composite_primary_keys/connection_adapters/abstract_mysql_adapter'
|
|
112
104
|
require 'composite_primary_keys/connection_adapters/abstract/connection_specification_changes'
|
|
113
105
|
|
|
114
106
|
require 'composite_primary_keys/relation/batches'
|
|
107
|
+
require 'composite_primary_keys/relation/where_clause'
|
|
115
108
|
require 'composite_primary_keys/relation/calculations'
|
|
116
109
|
require 'composite_primary_keys/relation/finder_methods'
|
|
117
110
|
require 'composite_primary_keys/relation/predicate_builder'
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module Associations
|
|
3
3
|
class Association
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
silence_warnings do
|
|
5
|
+
def creation_attributes
|
|
6
|
+
attributes = {}
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
if (reflection.has_one? || reflection.collection?) && !options[:through]
|
|
9
|
+
# CPK
|
|
10
|
+
# attributes[reflection.foreign_key] = owner[reflection.active_record_primary_key]
|
|
11
|
+
Array(reflection.foreign_key).zip(Array(reflection.active_record_primary_key)).each do |key1, key2|
|
|
12
|
+
attributes[key1] = owner[key2]
|
|
13
|
+
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
if reflection.options[:as]
|
|
16
|
+
attributes[reflection.type] = owner.class.base_class.name
|
|
17
|
+
end
|
|
16
18
|
end
|
|
17
|
-
end
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
attributes
|
|
21
|
+
end
|
|
20
22
|
end
|
|
21
23
|
end
|
|
22
24
|
end
|
|
@@ -1,69 +1,42 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module Associations
|
|
3
3
|
class AssociationScope
|
|
4
|
+
silence_warnings do
|
|
5
|
+
def next_chain_scope(scope, table, reflection, association_klass, foreign_table, next_reflection)
|
|
6
|
+
join_keys = reflection.join_keys(association_klass)
|
|
7
|
+
key = join_keys.key
|
|
8
|
+
foreign_key = join_keys.foreign_key
|
|
9
|
+
# CPK
|
|
10
|
+
# constraint = table[key].eq(foreign_table[foreign_key])
|
|
11
|
+
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
|
4
12
|
|
|
5
|
-
def self.get_bind_values(owner, chain)
|
|
6
|
-
binds = []
|
|
7
|
-
last_reflection = chain.last
|
|
8
|
-
|
|
9
|
-
# CPK
|
|
10
|
-
# binds << last_reflection.join_id_for(owner)
|
|
11
|
-
values = last_reflection.join_id_for(owner)
|
|
12
|
-
binds += Array(values)
|
|
13
|
-
|
|
14
|
-
if last_reflection.type
|
|
15
|
-
binds << owner.class.base_class.name
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
chain.each_cons(2).each do |reflection, next_reflection|
|
|
19
13
|
if reflection.type
|
|
20
|
-
|
|
14
|
+
value = transform_value(next_reflection.klass.base_class.name)
|
|
15
|
+
scope = scope.where(table.name => { reflection.type => value })
|
|
21
16
|
end
|
|
22
|
-
end
|
|
23
|
-
binds
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def next_chain_scope(scope, table, reflection, tracker, assoc_klass, foreign_table, next_reflection)
|
|
27
|
-
join_keys = reflection.join_keys(assoc_klass)
|
|
28
|
-
key = join_keys.key
|
|
29
|
-
foreign_key = join_keys.foreign_key
|
|
30
17
|
|
|
31
|
-
|
|
32
|
-
# constraint = table[key].eq(foreign_table[foreign_key])
|
|
33
|
-
constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
|
|
34
|
-
|
|
35
|
-
if reflection.type
|
|
36
|
-
value = next_reflection.klass.base_class.name
|
|
37
|
-
bind_val = bind scope, table.table_name, reflection.type, value, tracker
|
|
38
|
-
scope = scope.where(table[reflection.type].eq(bind_val))
|
|
18
|
+
scope = scope.joins(join(foreign_table, constraint))
|
|
39
19
|
end
|
|
40
20
|
|
|
41
|
-
scope
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
bind_val = bind scope, table.table_name, k.to_s, owner[fk], tracker
|
|
54
|
-
scope = scope.where(table[k].eq(bind_val))
|
|
21
|
+
def last_chain_scope(scope, table, reflection, owner, association_klass)
|
|
22
|
+
join_keys = reflection.join_keys(association_klass)
|
|
23
|
+
key = join_keys.key
|
|
24
|
+
foreign_key = join_keys.foreign_key
|
|
25
|
+
|
|
26
|
+
# CPK
|
|
27
|
+
if key.kind_of?(Array) || foreign_key.kind_of?(Array)
|
|
28
|
+
predicate = cpk_join_predicate(table, key, owner, foreign_key)
|
|
29
|
+
scope = scope.where(predicate)
|
|
30
|
+
else
|
|
31
|
+
value = transform_value(owner[foreign_key])
|
|
32
|
+
scope = scope.where(table.name => { key => value })
|
|
55
33
|
end
|
|
56
|
-
else
|
|
57
|
-
bind_val = bind scope, table.table_name, key.to_s, owner[foreign_key], tracker
|
|
58
|
-
scope = scope.where(table[key].eq(bind_val))
|
|
59
|
-
end
|
|
60
34
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
35
|
+
if reflection.type
|
|
36
|
+
polymorphic_type = transform_value(owner.class.base_class.name)
|
|
37
|
+
scope = scope.where(table.name => { reflection.type => polymorphic_type })
|
|
38
|
+
end
|
|
64
39
|
|
|
65
|
-
scope.where(table[reflection.type].eq(bind_val))
|
|
66
|
-
else
|
|
67
40
|
scope
|
|
68
41
|
end
|
|
69
42
|
end
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
module CompositePrimaryKeys
|
|
2
2
|
module CollectionAssociation
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
def get_records
|
|
4
|
+
cpk_applies = target.try(:composite?) || owner.try(:composite?)
|
|
5
|
+
return scope.to_a if cpk_applies
|
|
6
|
+
super
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def ids_writer(ids)
|
|
10
|
+
pk_type = reflection.primary_key_type
|
|
11
|
+
ids = Array(ids).reject(&:blank?)
|
|
12
|
+
ids.map! { |i| pk_type.cast(i) }
|
|
13
|
+
# CPK
|
|
14
|
+
if reflection.association_primary_key.is_a?(Array)
|
|
15
|
+
predicate = Class.new.extend(CompositePrimaryKeys::Predicates).cpk_in_predicate(klass.arel_table, reflection.association_primary_key, ids)
|
|
16
|
+
records = klass.where(predicate).index_by do |r|
|
|
17
|
+
reflection.association_primary_key.map{ |k| r.send(k) }
|
|
18
|
+
end.values_at(*ids)
|
|
19
|
+
else
|
|
20
|
+
records = klass.where(reflection.association_primary_key => ids).index_by do |r|
|
|
21
|
+
r.send(reflection.association_primary_key)
|
|
22
|
+
end.values_at(*ids)
|
|
9
23
|
end
|
|
10
|
-
|
|
24
|
+
replace(records)
|
|
11
25
|
end
|
|
12
26
|
end
|
|
13
27
|
end
|
|
14
28
|
|
|
15
|
-
ActiveRecord::Associations::CollectionAssociation.
|
|
29
|
+
ActiveRecord::Associations::CollectionAssociation.prepend CompositePrimaryKeys::CollectionAssociation
|
|
@@ -1,67 +1,29 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module Associations
|
|
3
3
|
class HasManyAssociation
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
scope.delete_all
|
|
7
|
-
else
|
|
8
|
-
# CPK
|
|
9
|
-
# scope.update_all(reflection.foreign_key => nil)
|
|
10
|
-
conds = Array(reflection.foreign_key).inject(Hash.new) do |mem, key|
|
|
11
|
-
mem[key] = nil
|
|
12
|
-
mem
|
|
13
|
-
end
|
|
14
|
-
scope.update_all(conds)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def delete_records(records, method)
|
|
19
|
-
if method == :destroy
|
|
20
|
-
records.each(&:destroy!)
|
|
21
|
-
update_counter(-records.length) unless inverse_updates_counter_cache?
|
|
22
|
-
else
|
|
23
|
-
if records == :all || !reflection.klass.primary_key
|
|
24
|
-
scope = self.scope
|
|
25
|
-
else
|
|
26
|
-
# CPK
|
|
27
|
-
# scope = self.scope.where(reflection.klass.primary_key => records)
|
|
28
|
-
table = Arel::Table.new(reflection.table_name)
|
|
29
|
-
and_conditions = records.map do |record|
|
|
30
|
-
eq_conditions = Array(reflection.association_primary_key).map do |name|
|
|
31
|
-
table[name].eq(record[name])
|
|
32
|
-
end
|
|
33
|
-
Arel::Nodes::And.new(eq_conditions)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
condition = and_conditions.shift
|
|
37
|
-
and_conditions.each do |and_condition|
|
|
38
|
-
condition = condition.or(and_condition)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
scope = self.scope.where(condition)
|
|
42
|
-
end
|
|
43
|
-
|
|
4
|
+
silence_warnings do
|
|
5
|
+
def delete_count(method, scope)
|
|
44
6
|
if method == :delete_all
|
|
45
|
-
|
|
7
|
+
scope.delete_all
|
|
46
8
|
else
|
|
47
9
|
# CPK
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
10
|
+
# scope.update_all(reflection.foreign_key => nil)
|
|
11
|
+
conds = Array(reflection.foreign_key).inject(Hash.new) do |mem, key|
|
|
12
|
+
mem[key] = nil
|
|
13
|
+
mem
|
|
52
14
|
end
|
|
53
|
-
|
|
15
|
+
scope.update_all(conds)
|
|
54
16
|
end
|
|
55
17
|
end
|
|
56
|
-
end
|
|
57
18
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
19
|
+
def foreign_key_present?
|
|
20
|
+
if reflection.klass.primary_key
|
|
21
|
+
# CPK
|
|
22
|
+
# owner.attribute_present?(reflection.association_primary_key)
|
|
23
|
+
Array(reflection.klass.primary_key).all? {|key| owner.attribute_present?(key)}
|
|
24
|
+
else
|
|
25
|
+
false
|
|
26
|
+
end
|
|
65
27
|
end
|
|
66
28
|
end
|
|
67
29
|
end
|