composite_primary_keys 3.0.7 → 3.0.8
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.txt
CHANGED
@@ -23,11 +23,6 @@ module ActiveRecord
|
|
23
23
|
include CompositeInstanceMethods
|
24
24
|
include CompositePrimaryKeys::ActiveRecord::AssociationPreload
|
25
25
|
EOV
|
26
|
-
|
27
|
-
class << unscoped
|
28
|
-
include CompositePrimaryKeys::ActiveRecord::FinderMethods::InstanceMethods
|
29
|
-
include CompositePrimaryKeys::ActiveRecord::Relation::InstanceMethods
|
30
|
-
end
|
31
26
|
end
|
32
27
|
|
33
28
|
def composite?
|
@@ -89,6 +84,20 @@ module ActiveRecord
|
|
89
84
|
def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')')
|
90
85
|
many_ids.map {|ids| "#{left_bracket}#{CompositePrimaryKeys::CompositeKeys.new(ids)}#{right_bracket}"}.join(list_sep)
|
91
86
|
end
|
87
|
+
|
88
|
+
def relation #:nodoc:
|
89
|
+
@relation ||= begin
|
90
|
+
result = Relation.new(self, arel_table)
|
91
|
+
# CPK
|
92
|
+
class << result
|
93
|
+
include CompositePrimaryKeys::ActiveRecord::FinderMethods::InstanceMethods
|
94
|
+
include CompositePrimaryKeys::ActiveRecord::Relation::InstanceMethods
|
95
|
+
end
|
96
|
+
result
|
97
|
+
end
|
98
|
+
|
99
|
+
finder_needs_type_condition? ? @relation.where(type_condition) : @relation
|
100
|
+
end
|
92
101
|
end
|
93
102
|
|
94
103
|
module CompositeInstanceMethods
|
@@ -6,6 +6,11 @@ module ActiveRecord
|
|
6
6
|
table = finder_class.unscoped
|
7
7
|
|
8
8
|
table_name = record.class.quoted_table_name
|
9
|
+
|
10
|
+
if value && record.class.serialized_attributes.key?(attribute.to_s)
|
11
|
+
value = YAML.dump value
|
12
|
+
end
|
13
|
+
|
9
14
|
sql, params = mount_sql_and_params(finder_class, table_name, attribute, value)
|
10
15
|
|
11
16
|
relation = table.where(sql, *params)
|
@@ -15,7 +20,7 @@ module ActiveRecord
|
|
15
20
|
relation = relation.where(scope_item => scope_value)
|
16
21
|
end
|
17
22
|
|
18
|
-
|
23
|
+
if record.persisted?
|
19
24
|
# CPK
|
20
25
|
if record.composite?
|
21
26
|
predicate = nil
|
@@ -31,87 +36,9 @@ module ActiveRecord
|
|
31
36
|
end
|
32
37
|
|
33
38
|
if relation.exists?
|
34
|
-
record.errors.add(attribute, :taken,
|
39
|
+
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
35
40
|
end
|
36
41
|
end
|
37
42
|
end
|
38
43
|
end
|
39
|
-
end
|
40
|
-
|
41
|
-
#module CompositePrimaryKeys
|
42
|
-
# module ActiveRecord
|
43
|
-
# module Validations
|
44
|
-
# module Uniqueness
|
45
|
-
# module ClassMethods
|
46
|
-
# def validates_uniqueness_of(*attr_names)
|
47
|
-
# configuration = { :case_sensitive => true }
|
48
|
-
# configuration.update(attr_names.extract_options!)
|
49
|
-
#
|
50
|
-
# validates_each(attr_names,configuration) do |record, attr_name, value|
|
51
|
-
# # The check for an existing value should be run from a class that
|
52
|
-
# # isn't abstract. This means working down from the current class
|
53
|
-
# # (self), to the first non-abstract class. Since classes don't know
|
54
|
-
# # their subclasses, we have to build the hierarchy between self and
|
55
|
-
# # the record's class.
|
56
|
-
# class_hierarchy = [record.class]
|
57
|
-
# while class_hierarchy.first != self
|
58
|
-
# class_hierarchy.insert(0, class_hierarchy.first.superclass)
|
59
|
-
# end
|
60
|
-
#
|
61
|
-
# # Now we can work our way down the tree to the first non-abstract
|
62
|
-
# # class (which has a database table to query from).
|
63
|
-
# finder_class = class_hierarchy.detect { |klass| !klass.abstract_class? }
|
64
|
-
#
|
65
|
-
# column = finder_class.columns_hash[attr_name.to_s]
|
66
|
-
#
|
67
|
-
# if value.nil?
|
68
|
-
# comparison_operator = "IS ?"
|
69
|
-
# elsif column.text?
|
70
|
-
# comparison_operator = "#{connection.case_sensitive_equality_operator} ?"
|
71
|
-
# value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s
|
72
|
-
# else
|
73
|
-
# comparison_operator = "= ?"
|
74
|
-
# end
|
75
|
-
#
|
76
|
-
# sql_attribute = "#{record.class.quoted_table_name}.#{connection.quote_column_name(attr_name)}"
|
77
|
-
#
|
78
|
-
# if value.nil? || (configuration[:case_sensitive] || !column.text?)
|
79
|
-
# condition_sql = "#{sql_attribute} #{comparison_operator}"
|
80
|
-
# condition_params = [value]
|
81
|
-
# else
|
82
|
-
# condition_sql = "LOWER(#{sql_attribute}) #{comparison_operator}"
|
83
|
-
# condition_params = [value.mb_chars.downcase]
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# if scope = configuration[:scope]
|
87
|
-
# Array(scope).map do |scope_item|
|
88
|
-
# scope_value = record.send(scope_item)
|
89
|
-
# condition_sql << " AND " << attribute_condition("#{record.class.quoted_table_name}.#{scope_item}", scope_value)
|
90
|
-
# condition_params << scope_value
|
91
|
-
# end
|
92
|
-
# end
|
93
|
-
#
|
94
|
-
# unless record.new_record?
|
95
|
-
# if record.class.composite?
|
96
|
-
# record.class.primary_keys.each do |key|
|
97
|
-
# condition_sql << " AND #{record.class.quoted_table_name}.#{key} <> ?"
|
98
|
-
# condition_params << record.send(key)
|
99
|
-
# end
|
100
|
-
# else
|
101
|
-
# condition_sql << " AND #{record.class.quoted_table_name}.#{record.class.primary_key} <> ?"
|
102
|
-
# condition_params << record.send(:id)
|
103
|
-
# end
|
104
|
-
# end
|
105
|
-
#
|
106
|
-
# finder_class.with_exclusive_scope do
|
107
|
-
# if finder_class.exists?([condition_sql, *condition_params])
|
108
|
-
# record.errors.add(attr_name, :taken, :default => configuration[:message], :value => value)
|
109
|
-
# end
|
110
|
-
# end
|
111
|
-
# end
|
112
|
-
# end
|
113
|
-
# end
|
114
|
-
# end
|
115
|
-
# end
|
116
|
-
# end
|
117
|
-
#end
|
44
|
+
end
|
data/test/debug.log
CHANGED
@@ -558,4 +558,18 @@ PGError: ERROR: operator does not exist: character varying = integer
|
|
558
558
|
LINE 1: ...ments".person_type = 'User') AND ("comments".person_id = 1))
|
559
559
|
^
|
560
560
|
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
|
561
|
+
: SELECT "hacks".* FROM "hacks" INNER JOIN "comments" ON ("hacks"."name" = "comments"."hack_id") WHERE (("comments".person_type = 'User') AND ("comments".person_id = 1))
|
562
|
+
[1m[36mSQL (35.0ms)[0m [1mSHOW client_min_messages[0m
|
563
|
+
[1m[35mSQL (0.0ms)[0m SET client_min_messages TO 'panic'
|
564
|
+
[1m[36mSQL (0.0ms)[0m [1mSET standard_conforming_strings = on[0m
|
565
|
+
[1m[35mSQL (1.0ms)[0m SET client_min_messages TO 'notice'
|
566
|
+
[1m[36mSQL (0.0ms)[0m [1mSHOW TIME ZONE[0m
|
567
|
+
PGError: ERROR: column "tariff_idstart_date" does not exist
|
568
|
+
LINE 1: SELECT COUNT(DISTINCT tariff_idstart_date) FROM "tariffs" LE...
|
569
|
+
^
|
570
|
+
: SELECT COUNT(DISTINCT tariff_idstart_date) FROM "tariffs" LEFT OUTER JOIN "product_tariffs" ON "product_tariffs"."tariff_id" = "tariffs"."tariff_id" AND "product_tariffs"."tariff_start_date" = "tariffs"."start_date"
|
571
|
+
PGError: ERROR: operator does not exist: character varying = integer
|
572
|
+
LINE 1: ...ments".person_type = 'User') AND ("comments".person_id = 1))
|
573
|
+
^
|
574
|
+
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
|
561
575
|
: SELECT "hacks".* FROM "hacks" INNER JOIN "comments" ON ("hacks"."name" = "comments"."hack_id") WHERE (("comments".person_type = 'User') AND ("comments".person_id = 1))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: composite_primary_keys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 3.0.
|
9
|
+
- 8
|
10
|
+
version: 3.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dr Nic Williams
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-
|
19
|
+
date: 2010-12-04 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|