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