Having a bit of a braindead day, can anyone help with this. I have three models: Player, Game, Prediction (Player has_many :games, :through => :prediction)
I want a named_scope that finds games that the current player hasn’t already predicted.
I started with something like this:
named_scope :without_prediction, lambda { |player_id|
{
:select => “games., predictions.”,
:joins => “LEFT JOIN predictions ON predictions.game_id = games.id”,
:conditions => “predictions.player_id IS NULL”
}
}
The problem is that this won’t work if ANY player has predicted that game’s result. So to be clear if there are games 1, 2 and 3 and players 10 and 11, player 10 has predicted results for all 3 games and player 10 has only predicted 1 and 2, I want a named_scope that returns game 3.
It seems like this is something I’ve done over and over again, but I just can’t get it clear in my head today.
Any ideas?
Cheers,
Andy
How about tackling it from the Player model like this
def unpredicted_games
Game.all - self.games
end
Having a bit of a braindead day, can anyone help with this. I have three
models: Player, Game, Prediction (Player has_many :games, :through =>
:prediction)
I want a named_scope that finds games that the current player hasn’t already
predicted.
How about tackling it from the Player model like this
def unpredicted_games
Game.all - self.games
end
That’ll do me…
This is only a site for about 30-40 friends, so I’m not too bothered about efficiency.
Cheers,
Andy
Having a bit of a braindead day, can anyone help with this. I have three
models: Player, Game, Prediction (Player has_many :games, :through =>
:prediction)
I want a named_scope that finds games that the current player hasn't already
predicted.
I started with something like this:
named_scope :without_prediction, lambda { |player_id|
{
:select => "games.*, predictions.*",
:joins => "LEFT JOIN predictions ON predictions.game_id = games.id",
:conditions => "predictions.player_id IS NULL"
}
}
The problem is that this won't work if ANY player has predicted that game's
result. So to be clear if there are games 1, 2 and 3 and players 10 and 11,
player 10 has predicted results for all 3 games and player 10 has only
predicted 1 and 2, I want a named_scope that returns game 3.
change the join so that the condition is predictions.game_id =
games.id and predictions.player_id = ...
and then change it so that the condition is predictions.id is NULL.
Also be careful when doing something like games.*, predictions.* -
identically named columns will shadow each other (eg id) which can
lead to strange bugs
Fred