Model.update and associations

Hi all,

Just a strange little one I came across this afternoon, I'd much
appreciate any thoughts any of you might have on it..

I was just implementing a small AJAX list sorter on a project, however
when I passed the "sortable_list" array and loop through it the .update
method seems to ignore associations on the object, and therefore they
get deleted.

Here's the scenario:

A Sport (model) has_and_belongs_to_many Locales and Groups. Standard
HABTM association. The association data is present and working.

However the following is generated from a Sport.update(2, :position =>
3) call in the console:

#<Sport id: 2, created_at: "2008-03-14 12:50:23", updated_at:
"2008-03-26 19:33:37", name: "Rugby, position: 3>

Is this intentional that the associations are not included, and hence
removed?

I've made a dirty hack to make this work, it's a bit fugly, but I'm
confused as to why I was getting the behaviour with .update above? Can
anyone shed some light?

Thanks,
Si.

Doesn't sound very normal. What's in your log files when this happens?

Fred

Frederick Cheung wrote:

Hi all,

Just a strange little one I came across this afternoon, I'd much
appreciate any thoughts any of you might have on it..

I was just implementing a small AJAX list sorter on a project, however
when I passed the "sortable_list" array and loop through it the .update
method seems to ignore associations on the object, and therefore they
get deleted.

Doesn't sound very normal. What's in your log files when this happens?

Fred

That's what I thought, I'm keen to get to the bottom of it:

Here's what happens when the action update_positions is fired from the
AJAX sortable list (this is using a slightly different dataset)

Processing SportsController#update_positions (for 127.0.0.1 at
2008-03-26 19:40:58) [POST]
  Session ID:
BAh7CToJdXNlcmkGOgxjb3VudHJ5IgdpZToOcmV0dXJuX3RvMCIKZmxhc2hJ%0AQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVz%0AZWR7AA%3D%3D--b54e6fd96bf73b96a15f6cfa6ed4fc24dcf1e642
  Parameters: {"action"=>"update_positions", "sortable_list"=>["3", "2",
"4", "5", "6", "7", "8", "9", "10", "11"], "controller"=>"admin/sports"}
  e[4;35;1mLocale Load (0.000762)e[0m e[0mSELECT * FROM `locales` e[0m
  e[4;36;1mLocale Columns (0.002516)e[0m e[0;1mSHOW FIELDS FROM
`locales`e[0m
  e[4;35;1mLocale Load (0.001546)e[0m e[0mSELECT * FROM `locales`
WHERE (`locales`.`country_code` = 'ie') LIMIT 1e[0m
  e[4;36;1mGroup Load (0.000514)e[0m e[0;1mSELECT * FROM `groups` e[0m
  e[4;35;1mCACHE (0.000000)e[0m e[0mSELECT * FROM `locales` WHERE
(`locales`.`country_code` = 'ie') LIMIT 1e[0m
  e[4;36;1mUser Columns (0.003802)e[0m e[0;1mSHOW FIELDS FROM
`users`e[0m
  e[4;35;1mUser Load (0.001512)e[0m e[0mSELECT * FROM `users` WHERE
(`users`.`id` = 1) LIMIT 1e[0m
  e[4;36;1mSport Columns (0.003293)e[0m e[0;1mSHOW FIELDS FROM
`sports`e[0m
  e[4;35;1mSport Load (0.000893)e[0m e[0mSELECT * FROM `sports` WHERE
(`sports`.`id` = 3) e[0m
  e[4;36;1mJoin Table Columns (0.002549)e[0m e[0;1mSHOW FIELDS FROM
`groups_sports`e[0m
  e[4;35;1mGroup Load (0.002243)e[0m e[0mSELECT * FROM `groups` INNER
JOIN groups_sports ON groups.id = groups_sports.group_id WHERE
(groups_sports.sport_id = 3 ) e[0m
  e[4;36;1mGroup Columns (0.002650)e[0m e[0;1mSHOW FIELDS FROM
`groups`e[0m
  e[4;35;1mSQL (0.001031)e[0m e[0mBEGINe[0m
  e[4;36;1mSQL (0.000315)e[0m e[0;1mDELETE FROM groups_sports WHERE
sport_id = 3 AND group_id IN (1,2)e[0m
  e[4;35;1mSQL (0.000740)e[0m e[0mCOMMITe[0m
  e[4;36;1mJoin Table Columns (0.002419)e[0m e[0;1mSHOW FIELDS FROM
`locales_sports`e[0m
  e[4;35;1mLocale Load (0.001201)e[0m e[0mSELECT * FROM `locales`
INNER JOIN locales_sports ON locales.id = locales_sports.locale_id WHERE
(locales_sports.sport_id = 3 ) e[0m
  e[4;36;1mSQL (0.000222)e[0m e[0;1mBEGINe[0m
  e[4;35;1mSQL (0.000386)e[0m e[0mDELETE FROM locales_sports WHERE
sport_id = 3 AND locale_id IN (1,2)e[0m
  e[4;36;1mSQL (0.000784)e[0m e[0;1mCOMMITe[0m
  e[4;35;1mSQL (0.000225)e[0m e[0mBEGINe[0m
  e[4;36;1mSport Update (0.000829)e[0m e[0;1mUPDATE `sports` SET
`created_at` = '2008-03-15 02:37:00', `position` = 1, `updated_at` =
'2008-03-26 19:40:58', `name` = 'Rugby' WHERE `id` = 3e[0m
  e[4;35;1mSQL (0.000668)e[0m e[0mCOMMITe[0m
  e[4;36;1mSport Load (0.000668)e[0m e[0;1mSELECT * FROM `sports`
WHERE (`sports`.`id` = 3) e[0m
  e[4;35;1mSQL (0.000156)e[0m e[0mBEGINe[0m
  e[4;36;1mSport Update (0.000392)e[0m e[0;1mUPDATE `sports` SET
`created_at` = '2008-03-15 02:37:00', `position` = 1, `updated_at` =
'2008-03-26 19:40:58', `name` = 'Rugby' WHERE `id` = 3e[0m
  e[4;35;1mSQL (0.000212)e[0m e[0mCOMMITe[0m
  e[4;36;1mSport Load (0.000587)e[0m e[0;1mSELECT * FROM `sports`
WHERE (`sports`.`id` = 2) e[0m
  e[4;35;1mJoin Table Columns (0.002631)e[0m e[0mSHOW FIELDS FROM
`groups_sports`e[0m
  e[4;36;1mGroup Load (0.001124)e[0m e[0;1mSELECT * FROM `groups`
INNER JOIN groups_sports ON groups.id = groups_sports.group_id WHERE
(groups_sports.sport_id = 2 ) e[0m
  e[4;35;1mSQL (0.000221)e[0m e[0mBEGINe[0m
  e[4;36;1mSQL (0.000365)e[0m e[0;1mDELETE FROM groups_sports WHERE
sport_id = 2 AND group_id IN (1,2)e[0m
  e[4;35;1mSQL (0.000702)e[0m e[0mCOMMITe[0m
  e[4;36;1mJoin Table Columns (0.002110)e[0m e[0;1mSHOW FIELDS FROM
`locales_sports`e[0m
  e[4;35;1mLocale Load (0.001991)e[0m e[0mSELECT * FROM `locales`
INNER JOIN locales_sports ON locales.id = locales_sports.locale_id WHERE
(locales_sports.sport_id = 2 ) e[0m
  e[4;36;1mSQL (0.000253)e[0m e[0;1mBEGINe[0m
  e[4;35;1mSQL (0.000351)e[0m e[0mDELETE FROM locales_sports WHERE
sport_id = 2 AND locale_id IN (1)e[0m
  e[4;36;1mSQL (0.000850)e[0m e[0;1mCOMMITe[0m
  e[4;35;1mSQL (0.000321)e[0m e[0mBEGINe[0m
  e[4;36;1mSport Update (0.000456)e[0m e[0;1mUPDATE `sports` SET
`created_at` = '2008-03-14 22:50:23', `position` = 2, `updated_at` =
'2008-03-26 19:40:58', `name` = 'Off Field' WHERE `id` = 2e[0m
  e[4;35;1mSQL (0.000661)e[0m e[0mCOMMITe[0m
  e[4;36;1mSport Load (0.000821)e[0m e[0;1mSELECT * FROM `sports`
WHERE (`sports`.`id` = 2) e[0m
  e[4;35;1mSQL (0.000150)e[0m e[0mBEGINe[0m
  e[4;36;1mSport Update (0.000262)e[0m e[0;1mUPDATE `sports` SET
`created_at` = '2008-03-14 22:50:23', `position` = 2, `updated_at` =
'2008-03-26 19:40:58', `name` = 'Off Field' WHERE `id` = 2e[0m
  e[4;35;1mSQL (0.000149)e[0m e[0mCOMMITe[0m
  e[4;36;1mSport Load (0.000529)e[0m e[0;1mSELECT * FROM `sports`
WHERE (`sports`.`id` = 4) e[0m
  e[4;35;1mJoin Table Columns (0.003138)e[0m e[0mSHOW FIELDS FROM
`groups_sports`e[0m
  e[4;36;1mGroup Load (0.001094)e[0m e[0;1mSELECT * FROM `groups`
INNER JOIN groups_sports ON groups.id = groups_sports.group_id WHERE
(groups_sports.sport_id = 4 ) e[0m