composite_primary_keys 13.0.1 → 13.0.2

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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +891 -888
  3. data/README.rdoc +181 -181
  4. data/Rakefile +37 -37
  5. data/lib/composite_primary_keys/arel/sqlserver.rb +37 -37
  6. data/lib/composite_primary_keys/arel/to_sql.rb +18 -18
  7. data/lib/composite_primary_keys/associations/association.rb +23 -23
  8. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  9. data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
  10. data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
  11. data/lib/composite_primary_keys/associations/{join_dependency.rb → join_association.rb} +1 -1
  12. data/lib/composite_primary_keys/associations/through_association.rb +25 -25
  13. data/lib/composite_primary_keys/autosave_association.rb +60 -60
  14. data/lib/composite_primary_keys/composite_arrays.rb +86 -86
  15. data/lib/composite_primary_keys/composite_relation.rb +29 -29
  16. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  17. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  18. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  19. data/lib/composite_primary_keys/fixtures.rb +21 -21
  20. data/lib/composite_primary_keys/persistence.rb +82 -82
  21. data/lib/composite_primary_keys/relation/calculations.rb +104 -104
  22. data/lib/composite_primary_keys/sanitization.rb +42 -42
  23. data/lib/composite_primary_keys/transactions.rb +34 -34
  24. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  25. data/lib/composite_primary_keys/version.rb +8 -8
  26. data/lib/composite_primary_keys.rb +118 -118
  27. data/scripts/console.rb +48 -48
  28. data/scripts/txt2html +76 -76
  29. data/scripts/txt2js +65 -65
  30. data/tasks/databases/mysql.rake +40 -40
  31. data/tasks/databases/oracle.rake +41 -41
  32. data/tasks/databases/postgresql.rake +38 -38
  33. data/tasks/databases/sqlite.rake +25 -25
  34. data/tasks/databases/sqlserver.rake +43 -43
  35. data/tasks/website.rake +18 -18
  36. data/test/README_tests.rdoc +56 -56
  37. data/test/abstract_unit.rb +114 -114
  38. data/test/connections/connection_spec.rb +27 -27
  39. data/test/connections/databases.example.yml +40 -40
  40. data/test/connections/databases.yml +40 -39
  41. data/test/fixtures/article.rb +10 -10
  42. data/test/fixtures/articles.yml +7 -7
  43. data/test/fixtures/capitol.rb +3 -3
  44. data/test/fixtures/capitols.yml +16 -16
  45. data/test/fixtures/comment.rb +5 -5
  46. data/test/fixtures/comments.yml +17 -17
  47. data/test/fixtures/department.rb +16 -16
  48. data/test/fixtures/dorm.rb +2 -2
  49. data/test/fixtures/dorms.yml +4 -4
  50. data/test/fixtures/employee.rb +5 -5
  51. data/test/fixtures/group.rb +2 -2
  52. data/test/fixtures/groups.yml +6 -6
  53. data/test/fixtures/membership.rb +8 -8
  54. data/test/fixtures/membership_status.rb +2 -2
  55. data/test/fixtures/membership_statuses.yml +16 -16
  56. data/test/fixtures/memberships.yml +10 -10
  57. data/test/fixtures/product.rb +9 -9
  58. data/test/fixtures/product_tariff.rb +5 -5
  59. data/test/fixtures/product_tariffs.yml +14 -14
  60. data/test/fixtures/products.yml +11 -11
  61. data/test/fixtures/reading.rb +4 -4
  62. data/test/fixtures/readings.yml +10 -10
  63. data/test/fixtures/reference_code.rb +7 -7
  64. data/test/fixtures/reference_codes.yml +28 -28
  65. data/test/fixtures/reference_type.rb +12 -12
  66. data/test/fixtures/reference_types.yml +9 -9
  67. data/test/fixtures/restaurant.rb +9 -9
  68. data/test/fixtures/restaurants.yml +14 -14
  69. data/test/fixtures/restaurants_suburb.rb +2 -2
  70. data/test/fixtures/room.rb +11 -11
  71. data/test/fixtures/room_assignment.rb +13 -13
  72. data/test/fixtures/room_assignments.yml +24 -24
  73. data/test/fixtures/room_attribute.rb +2 -2
  74. data/test/fixtures/room_attribute_assignment.rb +4 -4
  75. data/test/fixtures/room_attribute_assignments.yml +4 -4
  76. data/test/fixtures/room_attributes.yml +2 -2
  77. data/test/fixtures/rooms.yml +12 -12
  78. data/test/fixtures/street.rb +2 -2
  79. data/test/fixtures/student.rb +3 -3
  80. data/test/fixtures/students.yml +15 -15
  81. data/test/fixtures/suburb.rb +5 -5
  82. data/test/fixtures/tariff.rb +5 -5
  83. data/test/fixtures/tariffs.yml +14 -14
  84. data/test/fixtures/topic_sources.yml +3 -3
  85. data/test/fixtures/topics.yml +8 -8
  86. data/test/fixtures/users.yml +10 -10
  87. data/test/plugins/pagination.rb +405 -405
  88. data/test/plugins/pagination_helper.rb +135 -135
  89. data/test/test_associations.rb +372 -372
  90. data/test/test_attribute_methods.rb +63 -63
  91. data/test/test_callbacks.rb +99 -99
  92. data/test/test_composite_arrays.rb +38 -38
  93. data/test/test_counter_cache.rb +30 -30
  94. data/test/test_dumpable.rb +15 -15
  95. data/test/test_dup.rb +37 -37
  96. data/test/test_equal.rb +26 -26
  97. data/test/test_habtm.rb +141 -141
  98. data/test/test_miscellaneous.rb +32 -32
  99. data/test/test_optimistic.rb +18 -18
  100. data/test/test_pagination.rb +35 -35
  101. data/test/test_polymorphic.rb +43 -43
  102. data/test/test_predicates.rb +59 -59
  103. data/test/test_preload.rb +102 -102
  104. data/test/test_santiago.rb +23 -23
  105. data/test/test_touch.rb +23 -23
  106. data/test/test_tutorial_example.rb +25 -25
  107. data/test/test_validations.rb +13 -13
  108. metadata +4 -4
data/README.rdoc CHANGED
@@ -1,181 +1,181 @@
1
- = Composite Primary Keys for ActiveRecords
2
-
3
- == Summary
4
-
5
- ActiveRecords infamously doesn't support composite primary keys.
6
- This gem, composite_primary_keys, or CPK for short, extends ActiveRecord
7
- to support composite keys.
8
-
9
- == Installation
10
-
11
- gem install composite_primary_keys
12
-
13
- If you are using Rails add the following to your Gemfile:
14
-
15
- gem 'composite_primary_keys', '=x.x.x' (see next section about what version to use)
16
-
17
- == Versions
18
-
19
- Every major version of ActiveRecord has included numerous internal changes. As a result,
20
- CPK has to be rewritten for each version of ActiveRecord. To help keep
21
- things straight, here is the mapping:
22
-
23
- Version 13.x is designed to work with ActiveRecord 6.1.x
24
- Version 12.x is designed to work with ActiveRecord 6.0.x
25
- Version 11.x is designed to work with ActiveRecord 5.2.x
26
- Version 10.x is designed to work with ActiveRecord 5.1.x
27
- Version 9.x is designed to work with ActiveRecord 5.0.x
28
- Version 8.x is designed to work with ActiveRecord 4.2.x
29
- Version 7.x is designed to work with ActiveRecord 4.1.x
30
- Version 6.x is designed to work with ActiveRecord 4.0.x
31
- Version 5.x is designed to work with ActiveRecord 3.2.x
32
- Version 4.x is designed to work with ActiveRecord 3.1.x
33
-
34
- Run the following command to list available versions:
35
-
36
- gem list composite_primary_keys -ra
37
-
38
- == The basics
39
-
40
- A model with composite primary keys is defined like this:
41
-
42
- class Membership < ActiveRecord::Base
43
- self.primary_keys = :user_id, :group_id
44
- belongs_to :user
45
- belongs_to :group
46
- has_many :statuses, :class_name => 'MembershipStatus', :foreign_key => [:user_id, :group_id]
47
- end
48
-
49
- Note the addition of the line:
50
-
51
- self.primary_keys = :user_id, :group_id
52
-
53
-
54
- A model associated with a composite key model is defined like this:
55
-
56
- class MembershipStatus < ActiveRecord::Base
57
- belongs_to :membership, :foreign_key => [:user_id, :group_id]
58
- end
59
-
60
- That is, associations can include composite keys too. All Rails association types are supported. Nice.
61
-
62
- == Usage
63
-
64
- Once you’ve created your models to specify composite primary keys (such as the Membership class)
65
- and associations (such as MembershipStatus#membership), you can use them like any normal model
66
- with associations.
67
-
68
- But first, lets check out our primary keys.
69
-
70
- MembershipStatus.primary_key # => "id" # normal single key
71
- Membership.primary_key # => [:user_id, :group_id] # composite keys
72
- Membership.primary_key.to_s # => "user_id,group_id"
73
-
74
- Now we want to be able to find instances using the same syntax we always use for ActiveRecords…
75
-
76
- MembershipStatus.find(1) # single id returns single instance
77
- => <MembershipStatus:0x392a8c8 @attributes={"id"=>"1", "status"=>"Active"}>
78
-
79
- Membership.find([1,1]) # composite ids returns single instance
80
- => <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>
81
-
82
- Notice the use of an array to specify the composite key values.
83
-
84
- NOTE - API CHANGE. CPK Version 6.x and earlier used to allow composite keys to be listed out
85
- like this:
86
-
87
- Membership.find(1,1)
88
-
89
- This usage is no longer supported.
90
-
91
- == Databases
92
-
93
- CPK supports the following databases:
94
-
95
- * PostgreSQL
96
- * MySQL
97
- * MariaDB
98
- * Oracle
99
- * DB2
100
- * SQLite
101
- * SQLServer
102
-
103
- == Tests
104
-
105
- To run tests you first need to install the appropriate gems for the database you want to test. Database gems are
106
- divided into the following bundler groups:
107
-
108
- * mysql
109
- * oracle
110
- * postgresql
111
- * sqlite
112
- * sqlserver
113
-
114
- Since it is likely you do not have all the above databases installed on your computer, you want to install just the
115
- gems for your database. For example, to test postgresql you would install the appropriate gems like this:
116
-
117
- bundler config set --local without "mysql oracle sqlite sqlserver"
118
- bundler install
119
-
120
- Once you have installed the appropriate gems, the next step is to create the test database. There is a rake
121
- command for each database. Using our example:
122
-
123
- rake postgresql:build_database
124
-
125
- You can also rebuild the database if it already exists using this command:
126
-
127
- rake postgresql:rebuild_database
128
-
129
- To get a list of commands for your database use:
130
-
131
- Rake -T
132
-
133
- Finally, to run tests:
134
-
135
- rake postgresql:test
136
-
137
- Travis build status: {<img src="https://travis-ci.com/composite-primary-keys/composite_primary_keys.svg" alt="Build Status" />}[https://travis-ci.com/composite-primary-keys/composite_primary_keys]
138
-
139
- === DB2
140
-
141
- DB2 is no longer supported due to difficulties in getting the ibm_db2 gem to build. Thus tests
142
- have not been run against db2.
143
-
144
- === MariaDb (mysql)
145
-
146
- MariaDb is fully supported with all tests passing.
147
-
148
- === Oracle
149
-
150
- Oracle is fully supported with all tests passing.
151
-
152
- === Postgresql
153
-
154
- Postgresql is fully supported with all tests passing.
155
-
156
- === Sqlite 3
157
-
158
- The sqlite database is created at the path composite_primary_keys/db. Note you must *first* create the database using the
159
- built-in rake task before running tests:
160
-
161
- rake sqlite:build_database
162
-
163
- For sqlite3 to work correctly, you must manually require 'composite_primary_keys/connection_adapters/sqlite3_adapter' after
164
- loading the CPK gem.
165
-
166
- === SqlServer
167
-
168
- SqlServer is partially supported. There are a number of failing tests - patches welcomed.
169
-
170
- == Questions, Discussion and Contributions
171
-
172
- For help please visit https://github.com/composite-primary-keys/composite_primary_keys.
173
-
174
- == Author
175
-
176
- First version was written by Dr Nic Williams.
177
-
178
- Maintained by Charlie Savage
179
-
180
- Contributions by many!
181
-
1
+ = Composite Primary Keys for ActiveRecords
2
+
3
+ == Summary
4
+
5
+ ActiveRecords infamously doesn't support composite primary keys.
6
+ This gem, composite_primary_keys, or CPK for short, extends ActiveRecord
7
+ to support composite keys.
8
+
9
+ == Installation
10
+
11
+ gem install composite_primary_keys
12
+
13
+ If you are using Rails add the following to your Gemfile:
14
+
15
+ gem 'composite_primary_keys', '=x.x.x' (see next section about what version to use)
16
+
17
+ == Versions
18
+
19
+ Every major version of ActiveRecord has included numerous internal changes. As a result,
20
+ CPK has to be rewritten for each version of ActiveRecord. To help keep
21
+ things straight, here is the mapping:
22
+
23
+ Version 13.x is designed to work with ActiveRecord 6.1.x
24
+ Version 12.x is designed to work with ActiveRecord 6.0.x
25
+ Version 11.x is designed to work with ActiveRecord 5.2.x
26
+ Version 10.x is designed to work with ActiveRecord 5.1.x
27
+ Version 9.x is designed to work with ActiveRecord 5.0.x
28
+ Version 8.x is designed to work with ActiveRecord 4.2.x
29
+ Version 7.x is designed to work with ActiveRecord 4.1.x
30
+ Version 6.x is designed to work with ActiveRecord 4.0.x
31
+ Version 5.x is designed to work with ActiveRecord 3.2.x
32
+ Version 4.x is designed to work with ActiveRecord 3.1.x
33
+
34
+ Run the following command to list available versions:
35
+
36
+ gem list composite_primary_keys -ra
37
+
38
+ == The basics
39
+
40
+ A model with composite primary keys is defined like this:
41
+
42
+ class Membership < ActiveRecord::Base
43
+ self.primary_keys = :user_id, :group_id
44
+ belongs_to :user
45
+ belongs_to :group
46
+ has_many :statuses, :class_name => 'MembershipStatus', :foreign_key => [:user_id, :group_id]
47
+ end
48
+
49
+ Note the addition of the line:
50
+
51
+ self.primary_keys = :user_id, :group_id
52
+
53
+
54
+ A model associated with a composite key model is defined like this:
55
+
56
+ class MembershipStatus < ActiveRecord::Base
57
+ belongs_to :membership, :foreign_key => [:user_id, :group_id]
58
+ end
59
+
60
+ That is, associations can include composite keys too. All Rails association types are supported. Nice.
61
+
62
+ == Usage
63
+
64
+ Once you’ve created your models to specify composite primary keys (such as the Membership class)
65
+ and associations (such as MembershipStatus#membership), you can use them like any normal model
66
+ with associations.
67
+
68
+ But first, lets check out our primary keys.
69
+
70
+ MembershipStatus.primary_key # => "id" # normal single key
71
+ Membership.primary_key # => [:user_id, :group_id] # composite keys
72
+ Membership.primary_key.to_s # => "user_id,group_id"
73
+
74
+ Now we want to be able to find instances using the same syntax we always use for ActiveRecords…
75
+
76
+ MembershipStatus.find(1) # single id returns single instance
77
+ => <MembershipStatus:0x392a8c8 @attributes={"id"=>"1", "status"=>"Active"}>
78
+
79
+ Membership.find([1,1]) # composite ids returns single instance
80
+ => <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>
81
+
82
+ Notice the use of an array to specify the composite key values.
83
+
84
+ NOTE - API CHANGE. CPK Version 6.x and earlier used to allow composite keys to be listed out
85
+ like this:
86
+
87
+ Membership.find(1,1)
88
+
89
+ This usage is no longer supported.
90
+
91
+ == Databases
92
+
93
+ CPK supports the following databases:
94
+
95
+ * PostgreSQL
96
+ * MySQL
97
+ * MariaDB
98
+ * Oracle
99
+ * DB2
100
+ * SQLite
101
+ * SQLServer
102
+
103
+ == Tests
104
+
105
+ To run tests you first need to install the appropriate gems for the database you want to test. Database gems are
106
+ divided into the following bundler groups:
107
+
108
+ * mysql
109
+ * oracle
110
+ * postgresql
111
+ * sqlite
112
+ * sqlserver
113
+
114
+ Since it is likely you do not have all the above databases installed on your computer, you want to install just the
115
+ gems for your database. For example, to test postgresql you would install the appropriate gems like this:
116
+
117
+ bundler config set --local without "mysql oracle sqlite sqlserver"
118
+ bundler install
119
+
120
+ Once you have installed the appropriate gems, the next step is to create the test database. There is a rake
121
+ command for each database. Using our example:
122
+
123
+ rake postgresql:build_database
124
+
125
+ You can also rebuild the database if it already exists using this command:
126
+
127
+ rake postgresql:rebuild_database
128
+
129
+ To get a list of commands for your database use:
130
+
131
+ Rake -T
132
+
133
+ Finally, to run tests:
134
+
135
+ rake postgresql:test
136
+
137
+ Travis build status: {<img src="https://travis-ci.com/composite-primary-keys/composite_primary_keys.svg" alt="Build Status" />}[https://travis-ci.com/composite-primary-keys/composite_primary_keys]
138
+
139
+ === DB2
140
+
141
+ DB2 is no longer supported due to difficulties in getting the ibm_db2 gem to build. Thus tests
142
+ have not been run against db2.
143
+
144
+ === MariaDb (mysql)
145
+
146
+ MariaDb is fully supported with all tests passing.
147
+
148
+ === Oracle
149
+
150
+ Oracle is fully supported with all tests passing.
151
+
152
+ === Postgresql
153
+
154
+ Postgresql is fully supported with all tests passing.
155
+
156
+ === Sqlite 3
157
+
158
+ The sqlite database is created at the path composite_primary_keys/db. Note you must *first* create the database using the
159
+ built-in rake task before running tests:
160
+
161
+ rake sqlite:build_database
162
+
163
+ For sqlite3 to work correctly, you must manually require 'composite_primary_keys/connection_adapters/sqlite3_adapter' after
164
+ loading the CPK gem.
165
+
166
+ === SqlServer
167
+
168
+ SqlServer is partially supported. There are a number of failing tests - patches welcomed.
169
+
170
+ == Questions, Discussion and Contributions
171
+
172
+ For help please visit https://github.com/composite-primary-keys/composite_primary_keys.
173
+
174
+ == Author
175
+
176
+ First version was written by Dr Nic Williams.
177
+
178
+ Maintained by Charlie Savage
179
+
180
+ Contributions by many!
181
+
data/Rakefile CHANGED
@@ -1,37 +1,37 @@
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
- require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
12
- require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
13
-
14
- # Read the spec file
15
- spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
16
-
17
- # Setup Rake tasks for managing the gem
18
- Gem::PackageTask.new(spec).define
19
-
20
- # Now load in other task files
21
- Dir.glob('tasks/**/*.rake').each do |rake_file|
22
- load File.join(File.dirname(__FILE__), rake_file)
23
- end
24
-
25
- # Set up test tasks for each supported connection adapter
26
- %w(mysql sqlite oracle oracle_enhanced postgresql ibm_db sqlserver).each do |adapter|
27
- namespace adapter do
28
- desc "Run tests using the #{adapter} adapter"
29
- task "test" do
30
- ENV["ADAPTER"] = adapter
31
- Rake::TestTask.new("subtest_#{adapter}") do |t|
32
- t.libs << "test"
33
- end
34
- Rake::Task["subtest_#{adapter}"].invoke
35
- end
36
- end
37
- 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
+ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
12
+ require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
13
+
14
+ # Read the spec file
15
+ spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
16
+
17
+ # Setup Rake tasks for managing the gem
18
+ Gem::PackageTask.new(spec).define
19
+
20
+ # Now load in other task files
21
+ Dir.glob('tasks/**/*.rake').each do |rake_file|
22
+ load File.join(File.dirname(__FILE__), rake_file)
23
+ end
24
+
25
+ # Set up test tasks for each supported connection adapter
26
+ %w(mysql sqlite oracle oracle_enhanced postgresql ibm_db sqlserver).each do |adapter|
27
+ namespace adapter do
28
+ desc "Run tests using the #{adapter} adapter"
29
+ task "test" do
30
+ ENV["ADAPTER"] = adapter
31
+ Rake::TestTask.new("subtest_#{adapter}") do |t|
32
+ t.libs << "test"
33
+ end
34
+ Rake::Task["subtest_#{adapter}"].invoke
35
+ end
36
+ end
37
+ end
@@ -1,37 +1,37 @@
1
- module Arel
2
- module Visitors
3
- class SQLServer < Arel::Visitors::ToSql
4
- def make_Fetch_Possible_And_Deterministic o
5
- return if o.limit.nil? && o.offset.nil?
6
- t = table_From_Statement o
7
- pk = primary_Key_From_Table t
8
- return unless pk
9
- if o.orders.empty?
10
- # Prefer deterministic vs a simple `(SELECT NULL)` expr.
11
- # CPK
12
- #o.orders = [pk.asc]
13
- o.orders = pk.map {|a_pk| a_pk.asc}
14
- end
15
- end
16
-
17
- def primary_Key_From_Table t
18
- return unless t
19
- column_name = @connection.schema_cache.primary_keys(t.name) ||
20
- @connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
21
-
22
- # CPK
23
- # column_name ? t[column_name] : nil
24
- case column_name
25
- when Array
26
- column_name.map do |name|
27
- t[name]
28
- end
29
- when NilClass
30
- nil
31
- else
32
- [t[column_name]]
33
- end
34
- end
35
- end
36
- end
37
- end
1
+ module Arel
2
+ module Visitors
3
+ class SQLServer < Arel::Visitors::ToSql
4
+ def make_Fetch_Possible_And_Deterministic o
5
+ return if o.limit.nil? && o.offset.nil?
6
+ t = table_From_Statement o
7
+ pk = primary_Key_From_Table t
8
+ return unless pk
9
+ if o.orders.empty?
10
+ # Prefer deterministic vs a simple `(SELECT NULL)` expr.
11
+ # CPK
12
+ #o.orders = [pk.asc]
13
+ o.orders = pk.map {|a_pk| a_pk.asc}
14
+ end
15
+ end
16
+
17
+ def primary_Key_From_Table t
18
+ return unless t
19
+ column_name = @connection.schema_cache.primary_keys(t.name) ||
20
+ @connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
21
+
22
+ # CPK
23
+ # column_name ? t[column_name] : nil
24
+ case column_name
25
+ when Array
26
+ column_name.map do |name|
27
+ t[name]
28
+ end
29
+ when NilClass
30
+ nil
31
+ else
32
+ [t[column_name]]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,18 +1,18 @@
1
- module Arel
2
- module Visitors
3
- class ToSql
4
- def visit_CompositePrimaryKeys_CompositeKeys o, collector
5
- values = o.map do |key|
6
- case key
7
- when Arel::Attributes::Attribute
8
- "#{key.relation.name}.#{key.name}"
9
- else
10
- key
11
- end
12
- end
13
- collector << "(#{values.join(', ')})"
14
- collector
15
- end
16
- end
17
- end
18
- end
1
+ module Arel
2
+ module Visitors
3
+ class ToSql
4
+ def visit_CompositePrimaryKeys_CompositeKeys o, collector
5
+ values = o.map do |key|
6
+ case key
7
+ when Arel::Attributes::Attribute
8
+ "#{key.relation.name}.#{key.name}"
9
+ else
10
+ key
11
+ end
12
+ end
13
+ collector << "(#{values.join(', ')})"
14
+ collector
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,23 +1,23 @@
1
- module ActiveRecord
2
- module Associations
3
- class Association
4
- def creation_attributes
5
- attributes = {}
6
-
7
- if (reflection.has_one? || reflection.collection?) && !options[:through]
8
- # CPK
9
- # attributes[reflection.foreign_key] = owner[reflection.active_record_primary_key]
10
- Array(reflection.foreign_key).zip(Array(reflection.active_record_primary_key)).each do |key1, key2|
11
- attributes[key1] = owner[key2]
12
- end
13
-
14
- if reflection.options[:as]
15
- attributes[reflection.type] = owner.class.base_class.name
16
- end
17
- end
18
-
19
- attributes
20
- end
21
- end
22
- end
23
- end
1
+ module ActiveRecord
2
+ module Associations
3
+ class Association
4
+ def creation_attributes
5
+ attributes = {}
6
+
7
+ if (reflection.has_one? || reflection.collection?) && !options[:through]
8
+ # CPK
9
+ # attributes[reflection.foreign_key] = owner[reflection.active_record_primary_key]
10
+ Array(reflection.foreign_key).zip(Array(reflection.active_record_primary_key)).each do |key1, key2|
11
+ attributes[key1] = owner[key2]
12
+ end
13
+
14
+ if reflection.options[:as]
15
+ attributes[reflection.type] = owner.class.base_class.name
16
+ end
17
+ end
18
+
19
+ attributes
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,32 +1,32 @@
1
- module CompositePrimaryKeys
2
- module CollectionAssociation
3
- def ids_writer(ids)
4
- primary_key = reflection.association_primary_key
5
- pk_type = klass.type_for_attribute(primary_key)
6
- ids = Array(ids).reject(&:blank?)
7
- ids.map! { |i| pk_type.cast(i) }
8
-
9
- # CPK-
10
- if primary_key.is_a?(Array)
11
- predicate = CompositePrimaryKeys::Predicates.cpk_in_predicate(klass.arel_table, reflection.association_primary_key, ids)
12
- records = klass.where(predicate).index_by do |r|
13
- reflection.association_primary_key.map{ |k| r.send(k) }
14
- end.values_at(*ids)
15
- else
16
- records = klass.where(primary_key => ids).index_by do |r|
17
- r.public_send(primary_key)
18
- end.values_at(*ids).compact
19
- end
20
-
21
- if records.size != ids.size
22
- found_ids = records.map { |record| record.public_send(primary_key) }
23
- not_found_ids = ids - found_ids
24
- klass.all.raise_record_not_found_exception!(ids, records.size, ids.size, primary_key, not_found_ids)
25
- else
26
- replace(records)
27
- end
28
- end
29
- end
30
- end
31
-
1
+ module CompositePrimaryKeys
2
+ module CollectionAssociation
3
+ def ids_writer(ids)
4
+ primary_key = reflection.association_primary_key
5
+ pk_type = klass.type_for_attribute(primary_key)
6
+ ids = Array(ids).reject(&:blank?)
7
+ ids.map! { |i| pk_type.cast(i) }
8
+
9
+ # CPK-
10
+ if primary_key.is_a?(Array)
11
+ predicate = CompositePrimaryKeys::Predicates.cpk_in_predicate(klass.arel_table, reflection.association_primary_key, ids)
12
+ records = klass.where(predicate).index_by do |r|
13
+ reflection.association_primary_key.map{ |k| r.send(k) }
14
+ end.values_at(*ids)
15
+ else
16
+ records = klass.where(primary_key => ids).index_by do |r|
17
+ r.public_send(primary_key)
18
+ end.values_at(*ids).compact
19
+ end
20
+
21
+ if records.size != ids.size
22
+ found_ids = records.map { |record| record.public_send(primary_key) }
23
+ not_found_ids = ids - found_ids
24
+ klass.all.raise_record_not_found_exception!(ids, records.size, ids.size, primary_key, not_found_ids)
25
+ else
26
+ replace(records)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
32
  ActiveRecord::Associations::CollectionAssociation.prepend CompositePrimaryKeys::CollectionAssociation