Forum: Ruby on Rails Improving this messy has_many :through with :include

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alan (Guest)
on 2009-02-07 14:33
(Received via mailing list)
I have a question about cleaning up a rather complex has_many. I'll
describe the context in case it helps, but perhaps you can skip
straight to the code below.

* I am designing a fantasy football type system.
* I am modeling a Team which consists of many Players.
* I am connecting Teams and Players via a Transfer join model.
* A Transfer also has two GameWeeks (a GameWeek encapsulates the
start_time and end_time of a period of play).
* Transfer.from_end_of_gameweek indicates the GameWeek from which the
Player becomes part of the Team.
* Transfer.until_end_of_gameweek indicates the GameWeek from which a
Player ceases to be part of the Team.

So Transfers is essentially acting as a warehouse, storing history
about all player transfers that have taken place (in the future I
might make a dedicated warehouse but not yet).

Now, to determine which Players are playing for a Team at a given
instant I have this:

<pre>
class Team < ActiveRecord::Base
  has_many :transfers
  has_many :players, :through => :transfers,
    :include => [{ :transfers => :from_end_of_gameweek }, { :transfers
=> :until_end_of_gameweek }],
    :conditions => ['gameweeks.start_time <= ? AND (gameweeks.end_time
IS NULL OR ? < gameweeks.end_time)', Time.now.utc, Time.now.utc]
end
</pre>

Thus I can say team.transfers to get a list of all Transfers the Team
has made, or team.players to get the current squad.

It works, but that has_many is a pretty unpleasant bit of code and the
SQL doesn't look the most efficient. The question is, can this be made
more elegant and maybe efficient?

Thanks.
This topic is locked and can not be replied to.