Eager loading with find_by_sql

I have a model Tweets, it has_many :teams

I wrote a custom find_by_sql query for tweets (yes i tried all other
approaches) such that I can't eager load the teams. I collect the ids
and try to fake eager loading myself like so...

team_hash = {}
#collect up the tweet ids
tweet_ids = tweets.collect{|t| t.id}

#find the associated teams
TeamTweet.find(:all, :include => :team, :conditions => "tweet_id IN ("
+ tweet_ids.join(',') +")").each do |tt|
   team_hash[tt.tweet_id] = team_hash[tt.tweet_id] ? team_hash
[tt.tweet_id] << tt.team : [tt.team]
end

#reset the teams attribute
tweets.each do |tweet|
  teams = team_hash[tweet.id] ? team_hash[tweet.id] : []
  tweet.write_attribute(:teams, teams)
  # also tried tweet.teams = teams
end

I'm not sure f there is a better way to do this in general but when I
access tweet.teams it still queries the database for the teams on each
tweet even though I set it already. I assumed this would be a common
problem for people using find_by_sql but can't find anything. Any
solutions or suggestions would be greatly appreciated!

I have a model Tweets, it has_many :teams

I wrote a custom find_by_sql query for tweets (yes i tried all other
approaches) such that I can't eager load the teams. I collect the ids
and try to fake eager loading myself like so...

team_hash = {}
#collect up the tweet ids
tweet_ids = tweets.collect{|t| t.id}

#find the associated teams
TeamTweet.find(:all, :include => :team, :conditions => "tweet_id IN ("
+ tweet_ids.join(',') +")").each do |tt|
team_hash[tt.tweet_id] = team_hash[tt.tweet_id] ? team_hash
[tt.tweet_id] << tt.team : [tt.team]
end

#reset the teams attribute
tweets.each do |tweet|
teams = team_hash[tweet.id] ? team_hash[tweet.id] : []
tweet.write_attribute(:teams, teams)
# also tried tweet.teams = teams
end

Associations aren't attributes :slight_smile: There's a few bits of state you
need to fake up to convince AR that it has loaded an association. The
canonical example of this is probably the stuff in
association_preload.rb in Rails itself.

Fred

I'd recommend that you take a look at the association_preload.rb code
as well; I also wonder if the list might be able to help with the
find_by_sql query, given that you're working too hard on the
conditions below - :conditions => { :tweet_id => tweet_ids } will do
the same thing you're spelling out explicitly.

--Matt Jones

Thanks for the tip on the :conditions use Matt. I ended up just
doing

tweet.write_attribute(:eager_teams, teams)

I did this instead of trying to overwrite the association (which
Frederick aptly pointed out was not an attribute) and access that
property in the view instead of teams...its not the ideal solution but
it will do until a better solution presents itself.

Thanks!