i’m on a box with latest (today’s) ruby and rails. i started seeing
bizzare
errors with infinite stack recursion for a simple
ModelName.find :all
the code is kinda deep, but you can see how the problem occurs by
looking at
activerecord-1.13.1/lib/active_record/callbacks.rb +215
there we see
object = instantiate_without_callbacks(record)
scanning up a bit we see
def self.append_features(base) #:nodoc:
super
base.extend(ClassMethods)
base.class_eval do
class << self
include Observable
alias_method :instantiate_without_callbacks, :instantiate
alias_method :instantiate, :instantiate_with_callbacks
end
the first alias method is supposed to do
instantiate_without_callbacks -> ActiveRecord::Base::instaniate
the second
instantiate -> the yet to be defined
ActiveRecord::Callbacks::instantiate_with_callbacks
which takes you back to line 215, shows:
module ClassMethods #:nodoc:
def instantiate_with_callbacks(record)
··· ect = instantiate_without_callbacks(record)
what is supposed to happen here is that any call to
ActiveRecord::Base::instantiate first calls instantiate_with_callbacks,
which
calls instantiate_without_callbacks, which calls the, supposedly,
original
ActiveRecord::Base::instantiate.
what actually happens in this:
Company.find :all
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in
`find’
-
(irb):1:in `irb_binding’
-
/usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding’
-
/usr/local/lib/ruby/1.8/irb/workspace.rb:52
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/callbacks.rb:222:in
`instantiate’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in
`find’
-
(irb):1:in `irb_binding’
-
/usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding’
-
/usr/local/lib/ruby/1.8/irb/workspace.rb:52
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/callbacks.rb:222:in
`instantiate’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in
`find_by_sql’
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in
`find’
- (irb):1:in `irb_binding’
- /usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding’
- /usr/local/lib/ruby/1.8/irb/workspace.rb:52
and so on and so forth. eg. - infinite recursion.
it seems the original instanciate is lost in this whole method shuffling
approach.
this code works in 1.8.2 and 1.8.3. unless the bevhaiour of
alias_methods has
changed - hard to beleive - this seems to be a bad bug. i’ve tried to
distill
this to a simple example with no luck. so i’m afaid there is more to
it that
the above. all you need do to reproduce is setup a rails dir, create a
model,
and run YourModel.find :all.
system info
root:rr# uname -srm
FreeBSD 5.3-RELEASE i386
root:rr# ruby -v
ruby 1.8.4 (2005-12-01) [i386-freebsd5.3]
root:rr# rails -v
Rails 0.14.4
hopefully i’ve not overlooked something obvious here - our water pipes
froze
today so i haven’t been able to drink coffee.
thoughts?