composite_primary_keys 5.0.5 → 5.0.6
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.
- data/History.rdoc +12 -0
- data/lib/composite_primary_keys/attribute_methods/write.rb +1 -0
- data/lib/composite_primary_keys/relation/calculations.rb +3 -18
- data/lib/composite_primary_keys/version.rb +1 -1
- data/tasks/databases/mysql.rake +7 -7
- data/tasks/databases/oracle.rake +6 -6
- data/tasks/databases/postgresql.rake +7 -7
- data/tasks/databases/sqlite3.rake +7 -9
- data/test/connections/databases.example.yml +2 -2
- data/test/connections/databases.yml +2 -2
- data/test/fixtures/db_definitions/postgresql.sql +15 -44
- data/test/test_associations.rb +7 -0
- data/test/test_calculations.rb +6 -1
- metadata +3 -3
data/History.rdoc
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 5.0.6 2012-05-20
|
2
|
+
* Fixed bug where setting a belongs_to association to nil would raise an error (Tyler Rick)
|
3
|
+
* Remove special case code for 1 column selects and just choose to use Rails version of the
|
4
|
+
method unless we need ours to deal with an Array (Sammy Larbi)
|
5
|
+
* Change count tests to actually check for distinct, fix resulting error it
|
6
|
+
demonstrated in the code (Sammy Larbi)
|
7
|
+
* Specify mysql2 driver by default (Charlie Savage)
|
8
|
+
* Update sqlite tests to run on Windows (Charlie Savage)
|
9
|
+
|
1
10
|
== 5.0.5 2012-05-05
|
2
11
|
* Count without slower subquery in cases where that is possible (Sammy Larbi)
|
3
12
|
* When you call association.build for a has_many association that uses a
|
@@ -105,6 +114,9 @@ by replacing quoted identifiers with all-caps equivalents on Oracle (Rhett Sutph
|
|
105
114
|
* ActiveRecord 3.1 RC1 compatibility. This required a significant rewrite due to
|
106
115
|
all the changes in AR 3.1 versus 3.0.
|
107
116
|
|
117
|
+
== 3.1.11 2012-05-20
|
118
|
+
Fix AssociationReflection#derive_primary_key for belongs_to relationships (Heinrich Lee Yu).
|
119
|
+
|
108
120
|
== 3.1.10 2011-07-08
|
109
121
|
* Bugfix for belongs_to with includes (John Ash)
|
110
122
|
* Improved tests for calling clear on a habtm association, which involved (David Rueck)
|
@@ -39,6 +39,7 @@ module CompositePrimaryKeys
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def build_count_subquery(relation, column_name, distinct)
|
42
|
+
return super(relation, column_name, distinct) unless column_name.kind_of?(Array)
|
42
43
|
# CPK
|
43
44
|
# column_alias = Arel.sql('count_column')
|
44
45
|
subquery_alias = Arel.sql('subquery_for_count')
|
@@ -46,24 +47,8 @@ module CompositePrimaryKeys
|
|
46
47
|
# CPK
|
47
48
|
# aliased_column = aggregate_column(column_name == :all ? 1 : column_name).as(column_alias)
|
48
49
|
# relation.select_values = [aliased_column]
|
49
|
-
relation.select_values =
|
50
|
-
|
51
|
-
Arel::Attribute.new(@klass.unscoped.table, column)
|
52
|
-
end
|
53
|
-
elsif @klass.column_names.include?(column_name.to_s)
|
54
|
-
[Arel::Attribute.new(@klass.unscoped.table, column_name)]
|
55
|
-
else
|
56
|
-
[Arel.sql(column_name == :all ? "#{@klass.quoted_table_name}.*" : column_name.to_s)]
|
57
|
-
end
|
58
|
-
|
59
|
-
# do not use slower subquery if we're only counting on one column
|
60
|
-
if relation.select_values.count == 1
|
61
|
-
# exclude distinct table_name.* in case of joins where subbing * would change results
|
62
|
-
if (!distinct && column_name == :all) || column_name != :all
|
63
|
-
column = relation.select_values[0].gsub("#{@klass.quoted_table_name}.","")
|
64
|
-
relation.select_values = [operation_over_aggregate_column(column, 'count', distinct)]
|
65
|
-
return relation.arel
|
66
|
-
end
|
50
|
+
relation.select_values = column_name.map do |column|
|
51
|
+
Arel::Attribute.new(@klass.unscoped.table, column)
|
67
52
|
end
|
68
53
|
|
69
54
|
relation.distinct(true)
|
data/tasks/databases/mysql.rake
CHANGED
@@ -2,7 +2,7 @@ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
|
|
2
2
|
require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
|
3
3
|
|
4
4
|
namespace :mysql do
|
5
|
-
desc 'Create the MySQL test
|
5
|
+
desc 'Create the MySQL test database'
|
6
6
|
task :create_database do
|
7
7
|
ActiveRecord::Base.clear_all_connections!
|
8
8
|
spec = CompositePrimaryKeys::ConnectionSpec['mysql'].dup
|
@@ -12,8 +12,8 @@ namespace :mysql do
|
|
12
12
|
ActiveRecord::Base.clear_all_connections!
|
13
13
|
end
|
14
14
|
|
15
|
-
desc 'Build the MySQL test
|
16
|
-
task :
|
15
|
+
desc 'Build the MySQL test database'
|
16
|
+
task :build_database => [:create_database] do
|
17
17
|
path = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'mysql.sql')
|
18
18
|
sql = File.open(path, 'rb') do |file|
|
19
19
|
file.read
|
@@ -25,13 +25,13 @@ namespace :mysql do
|
|
25
25
|
ActiveRecord::Base.connection.execute(sql)
|
26
26
|
end
|
27
27
|
|
28
|
-
desc 'Drop the MySQL test
|
29
|
-
task :
|
28
|
+
desc 'Drop the MySQL test database'
|
29
|
+
task :drop_database => :load_connection do
|
30
30
|
ActiveRecord::Base.connection.drop_database(SPEC['database'])
|
31
31
|
end
|
32
32
|
|
33
|
-
desc 'Rebuild the MySQL test
|
34
|
-
task :
|
33
|
+
desc 'Rebuild the MySQL test database'
|
34
|
+
task :rebuild_database => [:drop_database, :build_database]
|
35
35
|
|
36
36
|
task :load_connection do
|
37
37
|
require File.join(PROJECT_ROOT, "test", "connections", "native_mysql", "connection")
|
data/tasks/databases/oracle.rake
CHANGED
@@ -2,22 +2,22 @@ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
|
|
2
2
|
require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
|
3
3
|
|
4
4
|
namespace :oracle do
|
5
|
-
desc 'Build the Oracle test
|
6
|
-
task :
|
5
|
+
desc 'Build the Oracle test database'
|
6
|
+
task :build_database => :load_connection do
|
7
7
|
options_str = connection_string
|
8
8
|
|
9
9
|
schema = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'oracle.sql')
|
10
10
|
sh %( sqlplus #{options_str} < #{schema} )
|
11
11
|
end
|
12
12
|
|
13
|
-
desc 'Drop the Oracle test
|
14
|
-
task :
|
13
|
+
desc 'Drop the Oracle test database'
|
14
|
+
task :drop_database => :load_connection do
|
15
15
|
options_str = connection_string
|
16
16
|
sh %( sqlplus #{options_str} < #{File.join(SCHEMA_PATH, 'oracle.drop.sql')} )
|
17
17
|
end
|
18
18
|
|
19
|
-
desc 'Rebuild the Oracle test
|
20
|
-
task :
|
19
|
+
desc 'Rebuild the Oracle test database'
|
20
|
+
task :rebuild_database => [:drop_database, :build_database]
|
21
21
|
|
22
22
|
task :load_connection do
|
23
23
|
require File.join(PROJECT_ROOT, "test", "connections", "native_oracle", "connection")
|
@@ -2,7 +2,7 @@ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
|
|
2
2
|
require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
|
3
3
|
|
4
4
|
namespace :postgresql do
|
5
|
-
desc 'Create the PostgreSQL test
|
5
|
+
desc 'Create the PostgreSQL test database'
|
6
6
|
task :create_database do
|
7
7
|
ActiveRecord::Base.clear_all_connections!
|
8
8
|
spec = CompositePrimaryKeys::ConnectionSpec['postgresql'].dup
|
@@ -13,8 +13,8 @@ namespace :postgresql do
|
|
13
13
|
ActiveRecord::Base.clear_all_connections!
|
14
14
|
end
|
15
15
|
|
16
|
-
desc 'Build the PostgreSQL test
|
17
|
-
task :
|
16
|
+
desc 'Build the PostgreSQL test database'
|
17
|
+
task :build_database => [:create_database] do
|
18
18
|
path = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'postgresql.sql')
|
19
19
|
sql = File.open(path, 'rb') do |file|
|
20
20
|
file.read
|
@@ -24,8 +24,8 @@ namespace :postgresql do
|
|
24
24
|
ActiveRecord::Base.connection.execute(sql)
|
25
25
|
end
|
26
26
|
|
27
|
-
desc 'Drop the PostgreSQL test
|
28
|
-
task :
|
27
|
+
desc 'Drop the PostgreSQL test database'
|
28
|
+
task :drop_database => :load_connection do
|
29
29
|
ActiveRecord::Base.clear_all_connections!
|
30
30
|
spec = CompositePrimaryKeys::ConnectionSpec['postgresql'].dup
|
31
31
|
database_name = spec.delete('database')
|
@@ -35,8 +35,8 @@ namespace :postgresql do
|
|
35
35
|
ActiveRecord::Base.clear_all_connections!
|
36
36
|
end
|
37
37
|
|
38
|
-
desc 'Rebuild the PostgreSQL test
|
39
|
-
task :
|
38
|
+
desc 'Rebuild the PostgreSQL test database'
|
39
|
+
task :rebuild_database => [:drop_database, :build_database]
|
40
40
|
|
41
41
|
task :load_connection do
|
42
42
|
require File.join(PROJECT_ROOT, "test", "connections", "native_postgresql", "connection")
|
@@ -2,26 +2,24 @@ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
|
|
2
2
|
require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
|
3
3
|
|
4
4
|
namespace :sqlite3 do
|
5
|
-
desc 'Build the sqlite test
|
6
|
-
task :
|
5
|
+
desc 'Build the sqlite test database'
|
6
|
+
task :build_database => :load_connection do
|
7
7
|
schema = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'sqlite.sql')
|
8
8
|
dbfile = File.join(PROJECT_ROOT, connection_string)
|
9
|
-
|
10
|
-
puts cmd
|
11
|
-
sh %{ #{cmd} }
|
9
|
+
FileUtils.mkdir_p(File.dirname(dbfile))
|
12
10
|
cmd = "sqlite3 #{dbfile} < #{schema}"
|
13
11
|
puts cmd
|
14
12
|
sh %{ #{cmd} }
|
15
13
|
end
|
16
14
|
|
17
|
-
desc 'Drop the sqlite test
|
18
|
-
task :
|
15
|
+
desc 'Drop the sqlite test database'
|
16
|
+
task :drop_database => :load_connection do
|
19
17
|
dbfile = connection_string
|
20
18
|
sh %{ rm -f #{dbfile} }
|
21
19
|
end
|
22
20
|
|
23
|
-
desc 'Rebuild the sqlite test
|
24
|
-
task :
|
21
|
+
desc 'Rebuild the sqlite test database'
|
22
|
+
task :rebuild_database => [:drop_database, :build_database]
|
25
23
|
|
26
24
|
task :load_connection do
|
27
25
|
require File.join(PROJECT_ROOT, "test", "connections", "native_sqlite3", "connection")
|
@@ -3,13 +3,13 @@
|
|
3
3
|
# 2. Update to match the databases you want to test against.
|
4
4
|
|
5
5
|
mysql:
|
6
|
-
adapter:
|
6
|
+
adapter: mysql2
|
7
7
|
username: root
|
8
8
|
database: composite_primary_keys_unittest
|
9
9
|
|
10
10
|
sqlite3:
|
11
11
|
adapter: sqlite3
|
12
|
-
database: db/composite_primary_keys_unittest.
|
12
|
+
database: db/composite_primary_keys_unittest.sqlite
|
13
13
|
|
14
14
|
postgresql:
|
15
15
|
adapter: postgresql
|
@@ -5,12 +5,12 @@
|
|
5
5
|
mysql:
|
6
6
|
adapter: mysql2
|
7
7
|
username: root
|
8
|
-
password:
|
8
|
+
password: root
|
9
9
|
database: composite_primary_keys_unittest
|
10
10
|
|
11
11
|
sqlite3:
|
12
12
|
adapter: sqlite3
|
13
|
-
database: db/composite_primary_keys_unittest.
|
13
|
+
database: db/composite_primary_keys_unittest.sqlite
|
14
14
|
|
15
15
|
postgresql:
|
16
16
|
adapter: postgresql
|
@@ -1,7 +1,5 @@
|
|
1
|
-
create sequence public.reference_types_seq start 1000;
|
2
|
-
|
3
1
|
create table reference_types (
|
4
|
-
reference_type_id
|
2
|
+
reference_type_id serial not null,
|
5
3
|
type_label varchar(50) default null,
|
6
4
|
abbreviation varchar(50) default null,
|
7
5
|
description varchar(50) default null,
|
@@ -17,10 +15,8 @@ create table reference_codes (
|
|
17
15
|
primary key (reference_type_id, reference_code)
|
18
16
|
);
|
19
17
|
|
20
|
-
create sequence public.products_seq start 1000;
|
21
|
-
|
22
18
|
create table products (
|
23
|
-
id
|
19
|
+
id serial not null,
|
24
20
|
name varchar(50) default null,
|
25
21
|
primary key (id)
|
26
22
|
);
|
@@ -46,46 +42,36 @@ create table suburbs (
|
|
46
42
|
primary key (city_id, suburb_id)
|
47
43
|
);
|
48
44
|
|
49
|
-
create sequence public.streets_seq start 1000;
|
50
|
-
|
51
45
|
create table streets (
|
52
|
-
id
|
46
|
+
id serial not null,
|
53
47
|
city_id int not null,
|
54
48
|
suburb_id int not null,
|
55
49
|
name varchar(50) not null,
|
56
50
|
primary key (id)
|
57
51
|
);
|
58
52
|
|
59
|
-
create sequence public.users_seq start 1000;
|
60
|
-
|
61
53
|
create table users (
|
62
|
-
id
|
54
|
+
id serial not null,
|
63
55
|
name varchar(50) not null,
|
64
56
|
primary key (id)
|
65
57
|
);
|
66
58
|
|
67
|
-
create sequence public.articles_seq start 1000;
|
68
|
-
|
69
59
|
create table articles (
|
70
|
-
id
|
60
|
+
id serial not null,
|
71
61
|
name varchar(50) not null,
|
72
62
|
primary key (id)
|
73
63
|
);
|
74
64
|
|
75
|
-
create sequence public.readings_seq start 1000;
|
76
|
-
|
77
65
|
create table readings (
|
78
|
-
id
|
66
|
+
id serial not null,
|
79
67
|
user_id int not null,
|
80
68
|
article_id int not null,
|
81
69
|
rating int not null,
|
82
70
|
primary key (id)
|
83
71
|
);
|
84
72
|
|
85
|
-
create sequence public.groups_seq start 1000;
|
86
|
-
|
87
73
|
create table groups (
|
88
|
-
id
|
74
|
+
id serial not null,
|
89
75
|
name varchar(50) not null,
|
90
76
|
primary key (id)
|
91
77
|
);
|
@@ -96,10 +82,8 @@ create table memberships (
|
|
96
82
|
primary key (user_id, group_id)
|
97
83
|
);
|
98
84
|
|
99
|
-
create sequence public.membership_statuses_seq start 1000;
|
100
|
-
|
101
85
|
create table membership_statuses (
|
102
|
-
id
|
86
|
+
id serial not null,
|
103
87
|
user_id int not null,
|
104
88
|
group_id int not null,
|
105
89
|
status varchar(50) not null,
|
@@ -112,29 +96,23 @@ create table departments (
|
|
112
96
|
primary key (department_id, location_id)
|
113
97
|
);
|
114
98
|
|
115
|
-
create sequence public.employees_seq start 1000;
|
116
|
-
|
117
99
|
create table employees (
|
118
|
-
id
|
100
|
+
id serial not null,
|
119
101
|
department_id int default null,
|
120
102
|
location_id int default null,
|
121
103
|
primary key (id)
|
122
104
|
);
|
123
105
|
|
124
|
-
create sequence public.comments_seq start 1000;
|
125
|
-
|
126
106
|
create table comments (
|
127
|
-
id
|
107
|
+
id serial not null,
|
128
108
|
person_id int default null,
|
129
109
|
person_type varchar(100) default null,
|
130
110
|
hack_id int default null,
|
131
111
|
primary key (id)
|
132
112
|
);
|
133
113
|
|
134
|
-
create sequence public.hacks_seq start 1000;
|
135
|
-
|
136
114
|
create table hacks (
|
137
|
-
id
|
115
|
+
id serial not null,
|
138
116
|
name varchar(50) not null,
|
139
117
|
primary key (id)
|
140
118
|
);
|
@@ -153,10 +131,8 @@ create table restaurants_suburbs (
|
|
153
131
|
suburb_id int not null
|
154
132
|
);
|
155
133
|
|
156
|
-
create sequence public.dorms_seq start 1000;
|
157
|
-
|
158
134
|
create table dorms (
|
159
|
-
id
|
135
|
+
id serial not null,
|
160
136
|
primary key (id)
|
161
137
|
);
|
162
138
|
|
@@ -166,10 +142,8 @@ create table rooms (
|
|
166
142
|
primary key (dorm_id, room_id)
|
167
143
|
);
|
168
144
|
|
169
|
-
create sequence public.room_attributes_seq start 1000;
|
170
|
-
|
171
145
|
create table room_attributes (
|
172
|
-
id
|
146
|
+
id serial not null,
|
173
147
|
name varchar(50),
|
174
148
|
primary key (id)
|
175
149
|
);
|
@@ -180,10 +154,8 @@ create table room_attribute_assignments (
|
|
180
154
|
room_attribute_id int not null
|
181
155
|
);
|
182
156
|
|
183
|
-
create sequence public.students_seq start 1000;
|
184
|
-
|
185
157
|
create table students (
|
186
|
-
id
|
158
|
+
id serial not null,
|
187
159
|
primary key (id)
|
188
160
|
);
|
189
161
|
|
@@ -210,5 +182,4 @@ create table products_restaurants (
|
|
210
182
|
product_id int not null,
|
211
183
|
franchise_id int not null,
|
212
184
|
store_id int not null
|
213
|
-
);
|
214
|
-
|
185
|
+
);
|
data/test/test_associations.rb
CHANGED
@@ -176,6 +176,13 @@ class TestAssociations < ActiveSupport::TestCase
|
|
176
176
|
assert_equal({:department_id=>[1, 2]}, steve.changes)
|
177
177
|
end
|
178
178
|
|
179
|
+
def test_composite_belongs_to__setting_to_nil
|
180
|
+
room_assignment = room_assignments(:jacksons_room)
|
181
|
+
# This was raising an error before:
|
182
|
+
# NoMethodError: undefined method `length' for nil:NilClass
|
183
|
+
assert_nothing_raised { room_assignment.room = nil }
|
184
|
+
end
|
185
|
+
|
179
186
|
def test_has_one_with_composite
|
180
187
|
# In this case a regular model has_one composite model
|
181
188
|
department = departments(:engineering)
|
data/test/test_calculations.rb
CHANGED
@@ -17,7 +17,12 @@ class TestCalculations < ActiveSupport::TestCase
|
|
17
17
|
|
18
18
|
def test_count_distinct
|
19
19
|
product = products(:first_product)
|
20
|
-
assert_equal(
|
20
|
+
assert_equal(1, product.product_tariffs.select('tariff_start_date').count(:distinct => true))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_count_not_distinct
|
24
|
+
product = products(:first_product)
|
25
|
+
assert_equal(2, product.product_tariffs.select('tariff_start_date').count(:distinct => false))
|
21
26
|
end
|
22
27
|
|
23
28
|
def test_count_includes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: composite_primary_keys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-05-
|
13
|
+
date: 2012-05-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -197,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
197
|
version: '0'
|
198
198
|
requirements: []
|
199
199
|
rubyforge_project: compositekeys
|
200
|
-
rubygems_version: 1.8.
|
200
|
+
rubygems_version: 1.8.24
|
201
201
|
signing_key:
|
202
202
|
specification_version: 3
|
203
203
|
summary: Composite key support for ActiveRecord
|