composite_primary_keys 11.0.0.beta4 → 11.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.rdoc +5 -0
- data/lib/composite_primary_keys.rb +9 -2
- data/lib/composite_primary_keys/associations/collection_association.rb +4 -4
- data/lib/composite_primary_keys/persistence.rb +16 -16
- data/lib/composite_primary_keys/relation.rb +4 -4
- data/lib/composite_primary_keys/relation/finder_methods.rb +2 -4
- data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +6 -4
- data/lib/composite_primary_keys/validations/uniqueness.rb +32 -0
- data/lib/composite_primary_keys/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfbfea33787da9b0c727a2f72624aa10cab7f1fd7d00ff925cf6332bbb7eab5e
|
4
|
+
data.tar.gz: d357900c434c2b9a9574ecfbf616298197b7c1351391c874dea4a878e61b4beb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fb6e448aae23c666782fa4a2f70225cd8834207f3b1eb853f342cf0f65d3d5c07ecadba8ae8a79f4b1e1830e2ee67596ad247e27c7c17abbc5343bbb07896b2
|
7
|
+
data.tar.gz: d7707078d862451d42f5c98b4fc2625b846beb478bcd5e91b8ab830d77e02dca083f8994e1ff681b3c35262687cbfbe0dbfb174161cef5ab2dcd4c8c7755b9af
|
data/History.rdoc
CHANGED
@@ -26,7 +26,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
26
26
|
|
27
27
|
unless defined?(ActiveRecord)
|
28
28
|
require 'rubygems'
|
29
|
-
gem 'activerecord', '~> 5.2.0.
|
29
|
+
gem 'activerecord', '~> 5.2.0.rc1'
|
30
30
|
require 'active_record'
|
31
31
|
end
|
32
32
|
|
@@ -68,6 +68,8 @@ require 'active_record/relation/finder_methods'
|
|
68
68
|
require 'active_record/relation/query_methods'
|
69
69
|
require 'active_record/relation/predicate_builder/association_query_value'
|
70
70
|
|
71
|
+
require 'active_record/validations/uniqueness'
|
72
|
+
|
71
73
|
# CPK files
|
72
74
|
require 'composite_primary_keys/persistence'
|
73
75
|
require 'composite_primary_keys/base'
|
@@ -108,7 +110,12 @@ require 'composite_primary_keys/relation/finder_methods'
|
|
108
110
|
require 'composite_primary_keys/relation/predicate_builder/association_query_value'
|
109
111
|
require 'composite_primary_keys/relation/query_methods'
|
110
112
|
|
113
|
+
require 'composite_primary_keys/validations/uniqueness'
|
114
|
+
|
111
115
|
require 'composite_primary_keys/composite_relation'
|
112
116
|
|
113
117
|
require 'composite_primary_keys/arel/to_sql'
|
114
|
-
|
118
|
+
|
119
|
+
# SQL Servers Support - uncomment these lines
|
120
|
+
#require 'activerecord-sqlserver-adapter/arel/visitors/sqlserver'
|
121
|
+
#require 'composite_primary_keys/arel/sqlserver'
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module CompositePrimaryKeys
|
2
2
|
module CollectionAssociation
|
3
3
|
def ids_writer(ids)
|
4
|
-
|
4
|
+
primary_key = reflection.association_primary_key
|
5
|
+
pk_type = klass.type_for_attribute(primary_key)
|
5
6
|
ids = Array(ids).reject(&:blank?)
|
6
7
|
ids.map! { |i| pk_type.cast(i) }
|
7
8
|
|
8
|
-
# CPK
|
9
|
-
if
|
9
|
+
# CPK-
|
10
|
+
if primary_key.is_a?(Array)
|
10
11
|
predicate = CompositePrimaryKeys::Predicates.cpk_in_predicate(klass.arel_table, reflection.association_primary_key, ids)
|
11
12
|
records = klass.where(predicate).index_by do |r|
|
12
13
|
reflection.association_primary_key.map{ |k| r.send(k) }
|
13
14
|
end.values_at(*ids)
|
14
15
|
else
|
15
|
-
primary_key = reflection.association_primary_key
|
16
16
|
records = klass.where(primary_key => ids).index_by do |r|
|
17
17
|
r.public_send(primary_key)
|
18
18
|
end.values_at(*ids).compact
|
@@ -30,22 +30,22 @@ module ActiveRecord
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
33
|
+
def _relation_for_itself
|
34
|
+
# CPK
|
35
|
+
if self.composite?
|
36
|
+
relation = self.class.unscoped
|
37
|
+
|
38
|
+
Array(self.class.primary_key).each do |key|
|
39
|
+
column = self.class.arel_table[key]
|
40
|
+
value = self[key]
|
41
|
+
relation = relation.where(column.eq(value))
|
42
|
+
end
|
43
|
+
|
44
|
+
relation
|
45
|
+
else
|
46
|
+
self.class.unscoped.where(self.class.primary_key => id)
|
47
|
+
end
|
48
|
+
end
|
49
49
|
|
50
50
|
def touch(*names, time: nil)
|
51
51
|
raise ActiveRecordError, "cannot touch on a new record object" unless persisted?
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
class Relation
|
3
3
|
alias :initialize_without_cpk :initialize
|
4
|
-
def initialize(klass, table, predicate_builder, values
|
5
|
-
initialize_without_cpk(klass, table, predicate_builder, values)
|
4
|
+
def initialize(klass, table: klass.arel_table, predicate_builder: klass.predicate_builder, values: {})
|
5
|
+
initialize_without_cpk(klass, table: table, predicate_builder: predicate_builder, values: values)
|
6
6
|
add_cpk_support if klass && klass.composite?
|
7
7
|
end
|
8
8
|
|
@@ -68,12 +68,12 @@ module ActiveRecord
|
|
68
68
|
stmt.from(table)
|
69
69
|
|
70
70
|
# CPK
|
71
|
-
if
|
71
|
+
if has_join_values? && @klass.composite?
|
72
72
|
arel_attributes = Array(primary_key).map do |key|
|
73
73
|
arel_attribute(key)
|
74
74
|
end.to_composite_keys
|
75
75
|
@klass.connection.join_to_delete(stmt, arel, arel_attributes)
|
76
|
-
elsif has_join_values?
|
76
|
+
elsif has_join_values? || has_limit_or_offset?
|
77
77
|
@klass.connection.join_to_delete(stmt, arel, arel_attribute(primary_key))
|
78
78
|
else
|
79
79
|
stmt.wheres = arel.constraints
|
@@ -58,11 +58,9 @@ module CompositePrimaryKeys
|
|
58
58
|
relation = relation.where(conditions)
|
59
59
|
end
|
60
60
|
when Array, Hash
|
61
|
-
relation
|
61
|
+
relation.where!(conditions)
|
62
62
|
else
|
63
|
-
unless conditions == :none
|
64
|
-
relation = relation.where(primary_key => conditions)
|
65
|
-
end
|
63
|
+
relation.where!(primary_key => conditions) unless conditions == :none
|
66
64
|
end
|
67
65
|
|
68
66
|
relation
|
@@ -4,11 +4,13 @@ module ActiveRecord
|
|
4
4
|
def queries
|
5
5
|
# CPK
|
6
6
|
if associated_table.association_join_foreign_key.is_a?(Array)
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
if ids.is_a?(ActiveRecord::Relation)
|
8
|
+
ids.map do |id|
|
9
|
+
id.ids_hash
|
10
|
+
end
|
11
|
+
else
|
12
|
+
[associated_table.association_join_foreign_key.zip(ids).to_h]
|
10
13
|
end
|
11
|
-
[result]
|
12
14
|
else
|
13
15
|
[associated_table.association_join_foreign_key.to_s => ids]
|
14
16
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Validations
|
3
|
+
class UniquenessValidator
|
4
|
+
def validate_each(record, attribute, value)
|
5
|
+
finder_class = find_finder_class_for(record)
|
6
|
+
value = map_enum_attribute(finder_class, attribute, value)
|
7
|
+
|
8
|
+
relation = build_relation(finder_class, attribute, value)
|
9
|
+
if record.persisted?
|
10
|
+
# CPK
|
11
|
+
if finder_class.primary_key.is_a?(Array)
|
12
|
+
predicate = finder_class.cpk_id_predicate(finder_class.arel_table, finder_class.primary_key, record.id_in_database || record.id)
|
13
|
+
relation = relation.where.not(predicate)
|
14
|
+
elsif finder_class.primary_key
|
15
|
+
relation = relation.where.not(finder_class.primary_key => record.id_in_database || record.id)
|
16
|
+
else
|
17
|
+
raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
relation = scope_relation(record, relation)
|
21
|
+
relation = relation.merge(options[:conditions]) if options[:conditions]
|
22
|
+
|
23
|
+
if relation.exists?
|
24
|
+
error_options = options.except(:case_sensitive, :scope, :conditions)
|
25
|
+
error_options[:value] = value
|
26
|
+
|
27
|
+
record.errors.add(attribute, :taken, error_options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: composite_primary_keys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 11.0.0.
|
4
|
+
version: 11.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charlie Savage
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/composite_primary_keys/relation/query_methods.rb
|
129
129
|
- lib/composite_primary_keys/relation/where_clause.rb
|
130
130
|
- lib/composite_primary_keys/sanitization.rb
|
131
|
+
- lib/composite_primary_keys/validations/uniqueness.rb
|
131
132
|
- lib/composite_primary_keys/version.rb
|
132
133
|
- scripts/console.rb
|
133
134
|
- scripts/txt2html
|