Maybe someone will find this useful:
I have a relatively complex (My)SQL query that results from having many
many :conditions and :includes, and MySQL seems to apply a wrong join
order so I wanted to force an order using the STRAIGHT_JOIN statement,
but rails doesn''t really let you do it. Having to construct this query
manually (there are 4 joins) and still have a right format for eager
association loading wasn''t really an option.
I digged into ActiveRecord and modifying the JoinDependency class to
output "STRAIGHT_JOIN"s instead of "LEFT OUTER JOIN"s looked
like too
much work too, so I decided to take a shorter route: intercept the
generated sql query, and replace SELECT with SELECT STRAIGHT_JOIN.
Here''s a monkey-patch (written against ActiveRecord 1.5.14) that
achieves this behaviour:
module ActiveRecord
class Base
class << self
VALID_FIND_OPTIONS << :straight_join
alias_method :orig_add_joins!, :add_joins!
def add_joins!(sql, options, scope = :auto)
orig_add_joins!(sql,options,scope)
sql.gsub!(/^SELECT/,''SELECT STRAIGHT_JOIN'') if
options[:straight_join]
end
end
end
end
So simply supply a :straight_join => true option to finder and it will
result in a SELECT STRAIGHT_JOIN .. query.
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---