> 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?

You've got something screwy somewhere...

old = Toy.fin>> old = Toy.find(1)
=> #<BabyToy id: 1, ......>
 >> new = Toy.new
=> #<Toy id: nil, ....>
 >> new.id = 1
=> 1
 >> old == new
=> false
 >> new == old
=> false

Rails 2.3.2.1

-philip







> 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