Forum: Ruby on Rails ActiveRecord allows un-synced aliases?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2d0f17b478aa748b34afec2e5ec07b8d?d=identicon&s=25 Anthony DeRobertis (Guest)
on 2006-03-07 05:33
(Received via mailing list)
q1 = Question.find(1)
q2 = Question.find(1)

Now, we find q1.__id__ != q2.__id__.

It appears the two aliases are not kept in sync:

q1.name                => 'old name'
q2.name = 'new name'
q2.save!
q1.name                => 'old name'
q2.name                => 'new name'
q1.reload
q1.name                => 'new name'


Even worse, is this fun:

q1.destroy
q2.name = 'third name'
q2.save!

That actually runs; ActiveRecord happily updates all 0 rows that match
(let's hope IDs can never be re-used, or that could have just updated
the wrong row)

Finally,

q2.reload
ActiveRecord::RecordNotFound: Couldn't find Question with ID=1


Why does ActiveRecord return two objects both representing a single row
in the database?
3ccecc71b9fb0a3d7f00a0bef6f0a63a?d=identicon&s=25 Kent Sibilev (Guest)
on 2006-03-07 08:07
(Received via mailing list)
This is correct. Rails doesn't use IdentityMap pattern (in terms of
PoEAA). You should be aware of that when you develop with Rails.

Kent
2d0f17b478aa748b34afec2e5ec07b8d?d=identicon&s=25 Anthony DeRobertis (Guest)
on 2006-03-07 21:07
(Received via mailing list)
Kent Sibilev wrote:

> This is correct. Rails doesn't use IdentityMap pattern (in terms of
> PoEAA). You should be aware of that when you develop with Rails.

Is .save! working on a record that (no longer) exists at least a bug?
Especially on databases that return the number of effected rows (at
least Pg and MySQL), this should be really easy to detect.
3ccecc71b9fb0a3d7f00a0bef6f0a63a?d=identicon&s=25 Kent Sibilev (Guest)
on 2006-03-08 00:47
(Received via mailing list)
That particular case I'd recommend to handle with database
transactions and an appropriate isolation level set. Also you should
look at the AR::Locking facility at

http://api.rubyonrails.org/classes/ActiveRecord/Locking.html

Kent.
This topic is locked and can not be replied to.