composite_primary_keys 5.0.5 → 5.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|