Duplicate 'SHOW FIELDS' statements when inserting data for production website

I am using a HABTM relationship for my app. When inserting data for a number of collection objects, I am seeing a 'SHOW FIELD' query as each row is inserted:

0m   e[4;36;1melements_tags Columns (0.020000)e[0m e[0;1mSHOW FIELDS FROM elements_tagse[0m   e[4;35;1mSQL (0.010000)e[0m e[0mINSERT INTO elements_tags (`element_id`, `tag_id`, `add_flag`) VALUES (3140, 2, NULL)e[0m   e[4;36;1melements_items Columns (0.010000)e[0m e[0;1mSHOW FIELDS FROM elements_itemse[0m   e[4;35;1mSQL (0.010000)e[0m e[0mINSERT INTO elements_items (`item_id`, `element_id`, `add_flag`) VALUES (94, 3140, 0)e[0m   e[4;36;1mitems_releases Columns (0.020000)e[0m e[0;1mSHOW FIELDS FROM items_releasese[0m   e[4;35;1mSQL (0.020000)e[0m e[0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (94, 97)e[0m   e[4;36;1mitems_releases Columns (0.010000)e[0m e[0;1mSHOW FIELDS FROM items_releasese[0m   e[4;35;1mSQL (0.020000)e[0m e[0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (91, 97)e[0m   e[4;36;1mitems_releases Columns (0.020000)e[0m e[0;1mSHOW FIELDS FROM items_releasese[0m   e[4;35;1mSQL (0.010000)e[0m e[0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (92, 97)e[0m   e[4;

What would cause this? From what I understand, the column meta data should be loaded only once as each model is loaded for the first time. This happens under both Oracle and MySQL. I am running with my environment set to production.

Thanks in advance, Don Mc

Any ideas,anyone?

Don.Mc wrote:

I am using a HABTM relationship for my app. When inserting data for a number of collection objects, I am seeing a 'SHOW FIELD' query as each row is inserted: ...    [4;36;1mitems_releases Columns (0.020000) [0m [0;1mSHOW FIELDS FROM items_releases [0m    [4;35;1mSQL (0.020000) [0m [0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (94, 97) [0m    [4;36;1mitems_releases Columns (0.010000) [0m [0;1mSHOW FIELDS FROM items_releases [0m    [4;35;1mSQL (0.020000) [0m [0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (91, 97) [0m    [4;36;1mitems_releases Columns (0.020000) [0m [0;1mSHOW FIELDS FROM items_releases [0m    [4;35;1mSQL (0.010000) [0m [0mINSERT INTO items_releases (`item_id`, `release_id`) VALUES (92, 97) [0m    [4;

What would cause this? From what I understand, the column meta data should be loaded only once as each model is loaded for the first time. This happens under both Oracle and MySQL. I am running with my environment set to production.

Rails currently doesn't cache columns of HABTM join tables. The fix would probably only involve changing line

http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb#L84

to read @columns ||= ...

Give it a try, or open a ticket.

Thanks! I will give it a try.

Regards, Don

Don.Mc wrote:

Thanks! I will give it a try.

Thinking about it, the change I suggested will only get rid of the last two SHOW FIELDS in your post; the join table fields will still be fetched separately for each parent object.

A proper fix would have to cache the columns inside the association reflection.

OK, will look at that. Thanks again.