> Your case is different because of STI (so your comparisons here are
> all false because the objects are of different class). If it weren't
> for that then it's a slightly messed up situation - Active record
> thinks it has a new record but it doesn't

Doh!  Didn't catch that.  And when I do it without involving STI then  
I get the results he's getting below.  Sorry Moo!

Hrm... well down in AR::Base we have this:

       # Returns true if the +comparison_object+ is the same object,  
or is of the same type and has the same id.
       def ==(comparison_object)
         comparison_object.equal?(self) ||
           (comparison_object.instance_of?(self.class) &&
             comparison_object.id == id &&
             !comparison_object.new_record?)
       end

Which interestingly enough matches each of the conditions the parent  
posted about.

I guess what this means then is if you're mucking around setting the  
id's of a record and before they are saved you should call equal?  
directly.

 >> old = AdminUser.find(1)
=> #<AdminUser id: 1...>
 >> new = AdminUser.new
=> #<AdminUser id: nil...>
 >> new.id = 1
=> 1
 >> old == new
=> false
 >> new == old
=> true
 >> old.equal?(new)
=> false
 >> new.equal?(old)
=> false



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