Lets say we have a many to many relationship like this:
class Unit
has_and_belongs_to_many :photos
end
class Photo
has_and_belongs_to_many :units
end
There is also a join table like this:
create_table "photos_units", :id => false, :force => true
do |t|
t.integer "unit_id"
t.integer "photo_id"
end
Now we launch Rails console and do something like this:
Photo.first.units << Unit.first
Checking the devlopment.log, I see the following queries
there:
[DEBUG: 2011/05/22 14:06:21 #16460] PK
and serial sequence (1.2ms) SELECT attr.attname, seq.relname FROM
pg_class seq, pg_attribute attr, pg_depend dep, pg_namespace name,
pg_constraint cons WHERE seq.oid = dep.objid AND seq.relkind = 'S'
AND attr.attrelid = dep.refobjid AND attr.attnum = dep.refobjsubid
AND attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[1]
AND cons.contype = 'p' AND dep.refobjid =
'"photos_units"'::regclass [DEBUG: 2011/05/22 14:06:21 #16460] PK
and custom sequence (0.6ms) SELECT attr.attname, CASE WHEN
split_part(def.adsrc, '''', 2) ~ '.' THEN
substr(split_part(def.adsrc, '''', 2), strpos(split_part(def.adsrc,
'''', 2), '.')+1) ELSE split_part(def.adsrc, '''', 2) END FROM
pg_class t JOIN pg_attribute attr ON (t.oid = attrelid) JOIN
pg_attrdef def ON (adrelid = attrelid AND adnum = attnum) JOIN
pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1])
WHERE t.oid = '"photos_units"'::regclass AND cons.contype = 'p' AND
def.adsrc ~* 'nextval'
Note that these column definition queries are executed over and
over again. If I keep executing the "Photo.first.units <<
Unit.first" on console, the column definitions queries keep
happening again (with no caching). I do have config.cache_classes
set to true.
This is on Postgres 8.3.14 and Rails 3.0.6.
This sounds like a Rails / ActiveRecord bug to me. Any help is
greatly appreciated!