composite_primary_keys 12.0.10 → 13.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +896 -880
  3. data/README.rdoc +181 -180
  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/association_scope.rb +4 -6
  9. data/lib/composite_primary_keys/associations/collection_association.rb +31 -31
  10. data/lib/composite_primary_keys/associations/foreign_association.rb +15 -15
  11. data/lib/composite_primary_keys/associations/has_many_association.rb +35 -35
  12. data/lib/composite_primary_keys/associations/{join_dependency.rb → join_association.rb} +137 -103
  13. data/lib/composite_primary_keys/associations/through_association.rb +1 -2
  14. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +0 -2
  15. data/lib/composite_primary_keys/attribute_methods/read.rb +1 -1
  16. data/lib/composite_primary_keys/attribute_methods/write.rb +1 -1
  17. data/lib/composite_primary_keys/attribute_methods.rb +14 -2
  18. data/lib/composite_primary_keys/autosave_association.rb +60 -60
  19. data/lib/composite_primary_keys/base.rb +137 -141
  20. data/lib/composite_primary_keys/composite_arrays.rb +86 -86
  21. data/lib/composite_primary_keys/composite_predicates.rb +2 -1
  22. data/lib/composite_primary_keys/composite_relation.rb +29 -29
  23. data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
  24. data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -26
  25. data/lib/composite_primary_keys/counter_cache.rb +15 -15
  26. data/lib/composite_primary_keys/fixtures.rb +21 -21
  27. data/lib/composite_primary_keys/nested_attributes.rb +1 -1
  28. data/lib/composite_primary_keys/persistence.rb +82 -82
  29. data/lib/composite_primary_keys/reflection.rb +64 -2
  30. data/lib/composite_primary_keys/relation/batches.rb +15 -7
  31. data/lib/composite_primary_keys/relation/calculations.rb +104 -81
  32. data/lib/composite_primary_keys/relation/finder_methods.rb +7 -7
  33. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +23 -4
  34. data/lib/composite_primary_keys/relation/query_methods.rb +2 -2
  35. data/lib/composite_primary_keys/relation/where_clause.rb +6 -11
  36. data/lib/composite_primary_keys/relation.rb +13 -9
  37. data/lib/composite_primary_keys/sanitization.rb +42 -42
  38. data/lib/composite_primary_keys/table_metadata.rb +11 -0
  39. data/lib/composite_primary_keys/transactions.rb +34 -34
  40. data/lib/composite_primary_keys/validations/uniqueness.rb +31 -31
  41. data/lib/composite_primary_keys/version.rb +8 -8
  42. data/lib/composite_primary_keys.rb +119 -117
  43. data/scripts/console.rb +48 -48
  44. data/scripts/txt2html +76 -76
  45. data/scripts/txt2js +65 -65
  46. data/tasks/databases/mysql.rake +40 -40
  47. data/tasks/databases/oracle.rake +41 -41
  48. data/tasks/databases/postgresql.rake +38 -38
  49. data/tasks/databases/sqlite.rake +25 -25
  50. data/tasks/databases/sqlserver.rake +43 -43
  51. data/tasks/website.rake +18 -18
  52. data/test/README_tests.rdoc +56 -56
  53. data/test/abstract_unit.rb +114 -114
  54. data/test/connections/connection_spec.rb +27 -27
  55. data/test/connections/databases.example.yml +40 -40
  56. data/test/connections/databases.yml +40 -39
  57. data/test/fixtures/article.rb +10 -10
  58. data/test/fixtures/articles.yml +7 -7
  59. data/test/fixtures/capitol.rb +3 -3
  60. data/test/fixtures/capitols.yml +16 -16
  61. data/test/fixtures/comment.rb +5 -5
  62. data/test/fixtures/comments.yml +17 -17
  63. data/test/fixtures/department.rb +16 -16
  64. data/test/fixtures/departments.yml +4 -0
  65. data/test/fixtures/dorm.rb +2 -2
  66. data/test/fixtures/dorms.yml +4 -4
  67. data/test/fixtures/employee.rb +5 -5
  68. data/test/fixtures/employees.yml +6 -1
  69. data/test/fixtures/group.rb +2 -2
  70. data/test/fixtures/groups.yml +6 -6
  71. data/test/fixtures/membership.rb +2 -0
  72. data/test/fixtures/membership_status.rb +2 -2
  73. data/test/fixtures/membership_statuses.yml +16 -16
  74. data/test/fixtures/memberships.yml +10 -10
  75. data/test/fixtures/product.rb +9 -9
  76. data/test/fixtures/product_tariff.rb +5 -5
  77. data/test/fixtures/product_tariffs.yml +14 -14
  78. data/test/fixtures/products.yml +11 -11
  79. data/test/fixtures/reading.rb +4 -4
  80. data/test/fixtures/readings.yml +10 -10
  81. data/test/fixtures/reference_code.rb +7 -7
  82. data/test/fixtures/reference_codes.yml +28 -28
  83. data/test/fixtures/reference_type.rb +12 -12
  84. data/test/fixtures/reference_types.yml +9 -9
  85. data/test/fixtures/restaurant.rb +9 -9
  86. data/test/fixtures/restaurants.yml +14 -14
  87. data/test/fixtures/restaurants_suburb.rb +2 -2
  88. data/test/fixtures/room.rb +11 -11
  89. data/test/fixtures/room_assignment.rb +13 -13
  90. data/test/fixtures/room_assignments.yml +24 -24
  91. data/test/fixtures/room_attribute.rb +2 -2
  92. data/test/fixtures/room_attribute_assignment.rb +4 -4
  93. data/test/fixtures/room_attribute_assignments.yml +4 -4
  94. data/test/fixtures/room_attributes.yml +2 -2
  95. data/test/fixtures/rooms.yml +12 -12
  96. data/test/fixtures/street.rb +2 -2
  97. data/test/fixtures/student.rb +3 -3
  98. data/test/fixtures/students.yml +15 -15
  99. data/test/fixtures/suburb.rb +5 -5
  100. data/test/fixtures/tariff.rb +5 -5
  101. data/test/fixtures/tariffs.yml +14 -14
  102. data/test/fixtures/topic_sources.yml +3 -3
  103. data/test/fixtures/topics.yml +8 -8
  104. data/test/fixtures/users.yml +10 -10
  105. data/test/plugins/pagination.rb +405 -405
  106. data/test/plugins/pagination_helper.rb +135 -135
  107. data/test/test_associations.rb +372 -358
  108. data/test/test_attribute_methods.rb +63 -63
  109. data/test/test_attributes.rb +19 -4
  110. data/test/test_calculations.rb +9 -2
  111. data/test/test_callbacks.rb +99 -99
  112. data/test/test_composite_arrays.rb +38 -38
  113. data/test/test_counter_cache.rb +30 -30
  114. data/test/test_delete.rb +8 -2
  115. data/test/test_dumpable.rb +15 -15
  116. data/test/test_dup.rb +37 -37
  117. data/test/test_equal.rb +26 -26
  118. data/test/test_find.rb +8 -2
  119. data/test/test_habtm.rb +141 -141
  120. data/test/test_miscellaneous.rb +32 -32
  121. data/test/test_optimistic.rb +18 -18
  122. data/test/test_pagination.rb +35 -35
  123. data/test/test_polymorphic.rb +43 -43
  124. data/test/test_predicates.rb +59 -59
  125. data/test/test_preload.rb +102 -102
  126. data/test/test_santiago.rb +23 -23
  127. data/test/test_touch.rb +23 -23
  128. data/test/test_tutorial_example.rb +25 -25
  129. data/test/test_update.rb +6 -0
  130. data/test/test_validations.rb +13 -13
  131. metadata +13 -12
data/README.rdoc CHANGED
@@ -1,180 +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 12.x is designed to work with ActiveRecord 6.0.x
24
- Version 11.x is designed to work with ActiveRecord 5.2.x
25
- Version 10.x is designed to work with ActiveRecord 5.1.x
26
- Version 9.x is designed to work with ActiveRecord 5.0.x
27
- Version 8.x is designed to work with ActiveRecord 4.2.x
28
- Version 7.x is designed to work with ActiveRecord 4.1.x
29
- Version 6.x is designed to work with ActiveRecord 4.0.x
30
- Version 5.x is designed to work with ActiveRecord 3.2.x
31
- Version 4.x is designed to work with ActiveRecord 3.1.x
32
-
33
- Run the following command to list available versions:
34
-
35
- gem list composite_primary_keys -ra
36
-
37
- == The basics
38
-
39
- A model with composite primary keys is defined like this:
40
-
41
- class Membership < ActiveRecord::Base
42
- self.primary_keys = :user_id, :group_id
43
- belongs_to :user
44
- belongs_to :group
45
- has_many :statuses, :class_name => 'MembershipStatus', :foreign_key => [:user_id, :group_id]
46
- end
47
-
48
- Note the addition of the line:
49
-
50
- self.primary_keys = :user_id, :group_id
51
-
52
-
53
- A model associated with a composite key model is defined like this:
54
-
55
- class MembershipStatus < ActiveRecord::Base
56
- belongs_to :membership, :foreign_key => [:user_id, :group_id]
57
- end
58
-
59
- That is, associations can include composite keys too. All Rails association types are supported. Nice.
60
-
61
- == Usage
62
-
63
- Once you’ve created your models to specify composite primary keys (such as the Membership class)
64
- and associations (such as MembershipStatus#membership), you can use them like any normal model
65
- with associations.
66
-
67
- But first, lets check out our primary keys.
68
-
69
- MembershipStatus.primary_key # => "id" # normal single key
70
- Membership.primary_key # => [:user_id, :group_id] # composite keys
71
- Membership.primary_key.to_s # => "user_id,group_id"
72
-
73
- Now we want to be able to find instances using the same syntax we always use for ActiveRecords…
74
-
75
- MembershipStatus.find(1) # single id returns single instance
76
- => <MembershipStatus:0x392a8c8 @attributes={"id"=>"1", "status"=>"Active"}>
77
-
78
- Membership.find([1,1]) # composite ids returns single instance
79
- => <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>
80
-
81
- Notice the use of an array to specify the composite key values.
82
-
83
- NOTE - API CHANGE. CPK Version 6.x and earlier used to allow composite keys to be listed out
84
- like this:
85
-
86
- Membership.find(1,1)
87
-
88
- This usage is no longer supported.
89
-
90
- == Databases
91
-
92
- CPK supports the following databases:
93
-
94
- * PostgreSQL
95
- * MySQL
96
- * MariaDB
97
- * Oracle
98
- * DB2
99
- * SQLite
100
- * SQLServer
101
-
102
- == Tests
103
-
104
- To run tests you first need to install the appropriate gems for the database you want to test. Database gems are
105
- divided into the following bundler groups:
106
-
107
- * mysql
108
- * oracle
109
- * postgresql
110
- * sqlite
111
- * sqlserver
112
-
113
- Since it is likely you do not have all the above databases installed on your computer, you want to install just the
114
- gems for your database. For example, to test postgresql you would install the appropriate gems like this:
115
-
116
- bundler config set --local without "mysql oracle sqlite sqlserver"
117
- bundler install
118
-
119
- Once you have installed the appropriate gems, the next step is to create the test database. There is a rake
120
- command for each database. Using our example:
121
-
122
- rake postgresql:build_database
123
-
124
- You can also rebuild the database if it already exists using this command:
125
-
126
- rake postgresql:rebuild_database
127
-
128
- To get a list of commands for your database use:
129
-
130
- Rake -T
131
-
132
- Finally, to run tests:
133
-
134
- rake postgresql:test
135
-
136
- 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]
137
-
138
- === DB2
139
-
140
- DB2 is no longer supported due to difficulties in getting the ibm_db2 gem to build. Thus tests
141
- have not been run against db2.
142
-
143
- === MariaDb (mysql)
144
-
145
- MariaDb is fully supported with all tests passing.
146
-
147
- === Oracle
148
-
149
- Oracle is fully supported with all tests passing.
150
-
151
- === Postgresql
152
-
153
- Postgresql is fully supported with all tests passing.
154
-
155
- === Sqlite 3
156
-
157
- The sqlite database is created at the path composite_primary_keys/db. Note you must *first* create the database using the
158
- built-in rake task before running tests:
159
-
160
- rake sqlite:build_database
161
-
162
- For sqlite3 to work correctly, you must manually require 'composite_primary_keys/connection_adapters/sqlite3_adapter' after
163
- loading the CPK gem.
164
-
165
- === SqlServer
166
-
167
- SqlServer is partially supported. There are a number of failing tests - patches welcomed.
168
-
169
- == Questions, Discussion and Contributions
170
-
171
- For help please visit https://github.com/composite-primary-keys/composite_primary_keys.
172
-
173
- == Author
174
-
175
- First version was written by Dr Nic Williams.
176
-
177
- Maintained by Charlie Savage
178
-
179
- Contributions by many!
180
-
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
@@ -23,9 +23,8 @@ module ActiveRecord
23
23
  end
24
24
 
25
25
  def last_chain_scope(scope, reflection, owner)
26
- join_keys = reflection.join_keys
27
- key = join_keys.key
28
- foreign_key = join_keys.foreign_key
26
+ key = reflection.join_primary_key
27
+ foreign_key = reflection.join_foreign_key
29
28
 
30
29
  table = reflection.aliased_table
31
30
 
@@ -46,9 +45,8 @@ module ActiveRecord
46
45
  end
47
46
 
48
47
  def next_chain_scope(scope, reflection, next_reflection)
49
- join_keys = reflection.join_keys
50
- key = join_keys.key
51
- foreign_key = join_keys.foreign_key
48
+ key = reflection.join_primary_key
49
+ foreign_key = reflection.join_foreign_key
52
50
 
53
51
  table = reflection.aliased_table
54
52
  foreign_table = next_reflection.aliased_table