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