Yes, I did that and works, just seems like a "hack" to an underlying
issue.  Currently the solutions you proposed is what I have done, but
it took some time to figure it out.

On 3/23/06, Rick Olson <[EMAIL PROTECTED]> wrote:
> On 3/23/06, Andrew Kaspick <[EMAIL PROTECTED]> wrote:
> > Hello,
> >
> > I came across what I believe is to be a bug in ActiveRecord with the
> > latest revision of edge rails.
> >
> > Basically what the problem deals with is any passed options to a
> > secondary find which are being modified internally when I believe they
> > shouldn't be.  Further explanation is easiest with code, so I'll just
> > jump right into it.
> >
> > Here's my scenario.  I have two models, Division and Team, and one
> > controller TestController...
> >
> > class Team < ActiveRecord::Base
> >   # don't need anything to show the bug
> > end
> >
> > class Division < ActiveRecord::Base
> >   has_many :teams
> > end
> >
> > class TestController < ApplicationController
> >   def index
> >     options = {:limit => 10}
> >
> >     logger.debug Division.find(1).teams.find(:all, options)
> >     logger.debug Division.find(2).teams.find(:all, options)
> >     logger.debug Division.find(3).teams.find(:all, options)
> >
> >     render :text => 'complete'
> >   end
> > end
> >
> > This produces the following sql in the order seen in the controller
> > (notice how the WHERE clause keeps getting appended too?)
> >
> > SELECT * FROM teams WHERE (teams.division_id = 1)
> > SELECT * FROM teams WHERE (teams.division_id = 2 AND
> > (teams.division_id = 1)) LIMIT 10
> > SELECT * FROM teams WHERE (teams.division_id = 3 AND
> > (teams.division_id = 2 AND (teams.division_id = 1))) LIMIT 10
> >
> > Now if I change the controller method to the following the "error" is gone.
> >
> > def index
> >   logger.debug Division.find(1).teams.find :all, {:limit => 10}
> >   logger.debug Division.find(2).teams.find :all, {:limit => 10}
> >   logger.debug Division.find(3).teams.find :all, {:limit => 10}
> >
> >   render :text => 'complete'
> > end
> >
> > So the options are being modified on subsequent calls here which I
> > would say is not good.  This is a narrowed down example from some real
> > code I'm using, but the essence of the problem is the same.  I dug
> > around some of the rails code, but didn't see anything obvious right
> > away.
> >
> > Thanks,
> > Andrew
>
> The scoping method must be directly modifying the hash.  Try this:
>
> Division.find(1).teams.find(:all, options.dup)
> Division.find(1).teams.find(:all, options.dup)
> Division.find(1).teams.find(:all, options.dup)
>
> --
> Rick Olson
> http://techno-weenie.net
> _______________________________________________
> Rails-core mailing list
> Rails-core@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails-core
>
_______________________________________________
Rails-core mailing list
Rails-core@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails-core

Reply via email to