composite_primary_keys 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/lib/composite_primary_keys/association_preload.rb +19 -10
- data/lib/composite_primary_keys/version.rb +1 -1
- data/tmp/test.db +0 -0
- data/website/index.html +2 -2
- data/website/version-raw.js +1 -1
- data/website/version.js +1 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -21,12 +21,12 @@ module CompositePrimaryKeys
|
|
21
21
|
end.join(" OR ")
|
22
22
|
|
23
23
|
conditions = [where, ids].flatten
|
24
|
-
joins = "INNER JOIN #{connection.quote_table_name options[:join_table]}
|
24
|
+
joins = "INNER JOIN #{connection.quote_table_name options[:join_table]} t0 ON #{full_composite_join_clause(reflection.klass.quoted_table_name, reflection.klass.primary_key, 't0', reflection.association_foreign_key)}"
|
25
25
|
parent_primary_keys = reflection.primary_key_name.to_s.split(CompositePrimaryKeys::ID_SEP).map{|k| "t0.#{k}"}
|
26
26
|
parent_record_id = connection.concat(parent_primary_keys.zip(["','"] * (parent_primary_keys.size - 1)).flatten.compact)
|
27
27
|
else
|
28
28
|
conditions = ["t0.#{reflection.primary_key_name} IN (?)", ids]
|
29
|
-
joins = "INNER JOIN #{connection.quote_table_name options[:join_table]}
|
29
|
+
joins = "INNER JOIN #{connection.quote_table_name options[:join_table]} t0 ON #{reflection.klass.quoted_table_name}.#{reflection.klass.primary_key} = t0.#{reflection.association_foreign_key}"
|
30
30
|
parent_record_id = reflection.primary_key_name
|
31
31
|
end
|
32
32
|
|
@@ -36,10 +36,10 @@ module CompositePrimaryKeys
|
|
36
36
|
:conditions => conditions,
|
37
37
|
:include => options[:include],
|
38
38
|
:joins => joins,
|
39
|
-
:select => "#{options[:select] || table_name+'.*'}, #{parent_record_id} as
|
39
|
+
:select => "#{options[:select] || table_name+'.*'}, #{parent_record_id} as parent_record_id_",
|
40
40
|
:order => options[:order])
|
41
41
|
|
42
|
-
set_association_collection_records(id_to_record_map, reflection.name, associated_records, '
|
42
|
+
set_association_collection_records(id_to_record_map, reflection.name, associated_records, 'parent_record_id_')
|
43
43
|
end
|
44
44
|
|
45
45
|
def preload_has_many_association(records, reflection, preload_options={})
|
@@ -106,14 +106,23 @@ module CompositePrimaryKeys
|
|
106
106
|
if options[:polymorphic]
|
107
107
|
raise AssociationNotSupported, "Polymorphic joins not supported for composite keys"
|
108
108
|
else
|
109
|
+
# I need to keep the original ids for each record (as opposed to the stringified) so
|
110
|
+
# that they get properly converted for each db so the id_map ends up looking like:
|
111
|
+
#
|
112
|
+
# { '1,2' => {:id => [1,2], :records => [...records...]}}
|
109
113
|
id_map = {}
|
114
|
+
|
110
115
|
records.each do |record|
|
111
|
-
key = primary_key_name.map{|k| record.send(k)}
|
112
|
-
|
113
|
-
|
114
|
-
|
116
|
+
key = primary_key_name.map{|k| record.send(k)}
|
117
|
+
key_as_string = key.join(CompositePrimaryKeys::ID_SEP)
|
118
|
+
|
119
|
+
if key_as_string
|
120
|
+
mapped_records = (id_map[key_as_string] ||= {:id => key, :records => []})
|
121
|
+
mapped_records[:records] << record
|
115
122
|
end
|
116
123
|
end
|
124
|
+
|
125
|
+
|
117
126
|
klasses_and_ids = [[reflection.klass.name, id_map]]
|
118
127
|
end
|
119
128
|
|
@@ -124,7 +133,7 @@ module CompositePrimaryKeys
|
|
124
133
|
|
125
134
|
if(composite?)
|
126
135
|
primary_key = klass.primary_key.to_s.split(CompositePrimaryKeys::ID_SEP)
|
127
|
-
ids = id_map.keys.uniq.map {|id| id
|
136
|
+
ids = id_map.keys.uniq.map {|id| id_map[id][:id]}
|
128
137
|
|
129
138
|
where = (primary_key * ids.size).in_groups_of(primary_key.size).map do |keys|
|
130
139
|
"(" + keys.map{|key| "#{table_name}.#{key} = ?"}.join(" AND ") + ")"
|
@@ -167,7 +176,7 @@ module CompositePrimaryKeys
|
|
167
176
|
# only one row per distinct foo_id' so this where we enforce that
|
168
177
|
next if seen_keys[associated_record_key]
|
169
178
|
seen_keys[associated_record_key] = true
|
170
|
-
mapped_records = id_to_record_map[associated_record_key]
|
179
|
+
mapped_records = id_to_record_map[associated_record_key][:records]
|
171
180
|
mapped_records.each do |mapped_record|
|
172
181
|
mapped_record.send("set_#{reflection_name}_target", associated_record)
|
173
182
|
end
|
data/tmp/test.db
CHANGED
Binary file
|
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>Composite Primary Keys</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/compositekeys"; return false'>
|
35
35
|
Get Version
|
36
|
-
<a href="http://rubyforge.org/projects/compositekeys" class="numbers">1.0.
|
36
|
+
<a href="http://rubyforge.org/projects/compositekeys" class="numbers">1.0.1</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ Ruby on Rails</h1>
|
39
39
|
|
@@ -296,7 +296,7 @@ other stories and things.</p>
|
|
296
296
|
|
297
297
|
<p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a>.</p>
|
298
298
|
<p class="coda">
|
299
|
-
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>,
|
299
|
+
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 6th June 2008<br>
|
300
300
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
301
301
|
</p>
|
302
302
|
</div>
|
data/website/version-raw.js
CHANGED
data/website/version.js
CHANGED
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: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Nic Williams
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-06-
|
12
|
+
date: 2008-06-06 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|