multiple foreign keys

Hi, I have two players playing a game. The game has foreign keys into each player: player1_id, player2_id

From the Player model, I can get the opponent self played if I know which player self was, but I want to agnostically pull everyone that self has played against, regardless of whether self was player1 or player2

I can get it with find_by_sql, but then my named scopes don’t work.

Really struggling to figure this out, looked at the guides, the api, googled, and played around, and I’m running out of time and steam.

Any ideas?

Thanks, Josh.

Also having difficulty getting the has_many to work with this. I thought about a separate join table for it,and even got it working with has_and_belongs_to_many :beat , :class_name => ‘Player’ , :foreign_key => ‘winner_id’ , :association_foreign_key => ‘loser_id’ , :join_table => ‘games’ , :conditions => { :active => true }

has_and_belongs_to_many :lost_to , :class_name => ‘Player’ , :foreign_key => ‘loser_id’ , :association_foreign_key => ‘winner_id’ , :join_table => ‘games’ , :conditions => { :active => true }

But then I still had the same problem of selecting everyone played and wasn’t sure how to deal with draws, and the game doesn’t know who is player1 and who is player2, so I moved them into the game table.

:confused:

Hi, I have two players playing a game. The game has foreign keys into each player: player1_id, player2_id

From the Player model, I can get the opponent self played if I know which player self was, but I want to agnostically pull everyone that self has played against, regardless of whether self was player1 or player2

I can get it with find_by_sql, but then my named scopes don't work.

Really struggling to figure this out, looked at the guides, the api, googled, and played around, and I'm running out of time and steam.

It would be less effort for us to work out what you are trying to do if you gave us the model relationships (belongs_to etc). Also if you show the sql that works it would allow us to see what you mean.

Colin

Basically I want to say

Game < AR::Base belongs_to :player1 belongs_to :player2

Player < AR::Base has_and_belongs_to_many :players , :through => :games end

And I want the current player to not care if it is player1 or player2

Here is the find_by_sql:

Player.find_by_sql “select * from players p where p.id in ( select distinct player1_id from games g where g.player2_id = #{self.id} ) or p.id in ( select distinct player2_id from games g where g.player1_id = #{self.id} )”

It would be less effort for us to work out what you are trying to do if you gave us the model relationships (belongs_to etc). Also if you show the sql that works it would allow us to see what you mean.

Colin

Basically I want to say

Game < AR::Base belongs_to :player1 belongs_to :player2

This will have to be something like belongs_to :player1, :class_name => 'Player', foreign_key => player1_id belongs_to :player2, :class_name => 'Player', foreign_key => player2_id

Player < AR::Base has_and_belongs_to_many :players , :through => :games

something like has_many :game_where_i_am_player1s, :class_name => 'Game', :foreign_key => player1_id has_many :game_where_i_am_player2s, :class_name => 'Game, :foreign_key => player2_id

has_many :player2s, :through => :game_where_i_am_player1s has_many :player1s, :through => :game_where_i_am_player2s

Then if you have @player you can say @player.player2s + @player.player1s to get all the opponents

I am sure there are better ways but that may get you going. All untested of course and quite possibly a load of rubbish.

Colin