Hi Fred,

Thank you for the response! What you said made sense. thanks for the
explanation.

However, looking at the last criteria of the == implementation, we can
see why something like what i mentioned would fail:

let's say i have an 2 AR objects:
> old = Something.find(1)
=> #<Something id: 1>

then i create a new object:
> new = Something.new
=> #<Something id: nil>
> new.id = 1 # something like this is possible, how or why is another story...
> new
=> #<Something id: 1>

now do:
> new == old
=> true
> old == new
=> false

== method should be commutative, right?

appreciate any comments!
-Moo

On Apr 10, 10:52 am, Frederick Cheung <frederick.che...@gmail.com>
wrote:
> On Apr 10, 5:50 pm, Moo <janec...@gmail.com> wrote:> Anyone has any thoughts 
> on this please?
>
> Basically the rationale is that == should mean 'do these objects
> correspond to the same database row ?'
>
> The reason why unsaved records are special cased is that two unsaved
> record would have equal id (nil in both cases) but if you saved them
> you would end up with 2 distinct rows in your database.
>
> I'm not sure why you're getting  new ==old not being the same as old
> == new. They should both be false (and are on my machine)
>
> Fred
>
> > On Apr 8, 5:29 pm, Moo <janec...@gmail.com> wrote:
>
> > > Hi Everyone,
>
> > > I'm running into a problem with theActiveRecord::Base "==" method
> > > defined here (it's 2.3.2, but it looks the same in older versions
> > > too):
>
> > >       # File rails-2.3.2/activerecord/lib/active_record/base.rb, line
> > > 2816
> > > 2816:       def ==(comparison_object)
> > > 2817:         comparison_object.equal?(self) ||
> > > 2818:           (comparison_object.instance_of?(self.class) &&
> > > 2819:             comparison_object.id == id &&
> > > 2820:             !comparison_object.new_record?)
> > > 2821:       end
>
> > > Because of the last criteria (!comparison_object.new_record?),
> > > something like this happens... say i have a new record and an existing
> > > record (different objects) and compare them:
>
> > > > new == old
> > > => true
> > > > old == new
>
> > > => false
>
> > > If this is intentional, can someone please explain why this is?
>
> > > Also what is the rational of only comparing the ID and not the all the
> > > values too and why does it matter if it's a new record or not?
>
> > > Thank you!
> > > -Moo
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to