composite_primary_keys 11.0.0.beta4 → 11.0.0.rc1
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.
- 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
|