I did a bit more looking in to using a :conditions hash to force ActiveRecord to fall back on the Rails 2.0 method of eager fetching associations, and this is absolutely not what I am looking for. For one, the Rails 2.0 eager fetch strategy always uses OUTER JOINs, and it also includes a join for all associations specified as an :include, rather than just those that are specified in a condition.
I am looking for some way to essentially force ActiveRecord to eagerly fetch specific associations/:include's using an INNER JOIN in the query that is also being used to fetch the data for the base object. The more I think about it, the more I think that this functionality does not really exist in ActiveRecord, and it would have to be written as an extension/plugin. However, since I'm pretty new to Rails, I wanted to put it to all the experts on this forum before throwing in the towel. - Justin On Nov 4, 1:45 am, Justin Holzer <[EMAIL PROTECTED]> wrote: > I was wondering if it was possible to have rails use an inner/outer > join to eager fetch a belongs_to association, rather than having it > generate multiple SQL queries? > > In this case, here are my model objects with the assoications: > > class Restaurant < ActiveRecord::Base > belongs_to :state > end > > class State < ActiveRecord::Base > has_many :restaurants > end > > In my controller action, I am currently doing... > @restaurant = Restaurant.find(params[:id], :include => [:state]) > > ... which is causing multiple SQL queries to be generated, one to > select the restaurant info, and the other to select the state info. Is > there a way to easily override this default behavior and have rails > generate a single query with an INNER or OUTER join while still > populating the state info for the restaurant? > > I did a bit of research on the changes to ActiveRecord between 2.0 and > 2.1, and I understand why the default behavior is to generate multiple > SQL queries, since in the case where you have a relationship such as > has_many that is referenced in the :include, if ActiveRecord were to > use a single SQL query, AR might end up having to parse a number of > records much larger than the number of distinct rows you will be > displaying. > > I am also aware that if you invoke a condition on a row not in the > table corresponding to the model object in the call to find(), that > ActiveRecord will fall back on the old method of generating a single > query with joins. However, I would prefer to not add any conditions, > as that seems like kind of a hack. If absolutely necessary, I suppose > I a condition like "states.id = restaurants.state_id" could be added, > but that just seems altogether ugly. > > However, in some cases, such as the one I mention above, I think it > might be desirable to be able to ask ActiveRecord to generate a single > query, since the result of the SQL would be at most a single row > anyhow. --~--~---------~--~----~------------~-------~--~----~ 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 [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---

