Как да създадете връзка ActiveRecord, която може да принадлежи на потребител чрез колона с външен ключ

Имам модел за мач (кибрит, т.е. мач за тенис или пинг-понг). Включва 2 играча (player1, player2) и бих искал моите user.matches да връщат екземпляри на потребителя в player1 и player2.

Системата, която имам, е както по-долу, но изглежда тромава и неинтуитивна:

ПОТРЕБИТЕЛСКИ МОДЕЛ:

has_many :matches, :foreign_key => "player1_id"
 has_many :reverse_matches, :foreign_key => "player2_id", :class_name => "Match"

СЪОТВЕТСТВИЕ НА МОДЕЛ:

belongs_to :player1, :foreign_key => "player1_id", :class_name => "User"
  belongs_to :player2, :foreign_key => "player2_id", :class_name => "User"

Отворен съм за предложения и за това как да структурирам модела (т.е. ако колоните player1/player2 не са правилният начин).

Само не забравяйте, че всеки мач трябва да принадлежи на 2 и само 2 играчи.


person Laurent    schedule 26.11.2013    source източник


Отговори (1)


Това трябва да работи за вас:

# User model
class User < ActiveRecord::Base
  has_many :home_matches, foreign_key: 'player1_id', class_name: 'Match' # if player1_id so he played at home
  has_many :away_matches, foreign_key: 'player2_id', class_name: 'Match' # if player2_id so he played to the other player's place

  def all_matches
    Match.where('player1_id = :user_id OR player2_id = :user_id', user_id: self.id)
  end

# Match model
class Match < ActiveRecord::Base
  belongs_to :home_player, foreign_key: 'player1_id', class_name: 'User'
  belongs_to :away_player, foreign_key: 'player2_id', class_name: 'User'

  def players
    User.where(id: [self.player1_id, self.player2_id])
  end


# usage
user = User.first
user.all_match # => returns the list of all played matches
user.home_matches # => returns the matches where this user was referenced as player1
user.away_matches # => returns the matches where this user was referenced as player2

match = Match.first
match.players # => returns the two players
match.home_player # => returns the player1
person MrYoshiji    schedule 26.11.2013
comment
Добре, готино - значи няма начин да направим двете колони неразличими? На този етап съм просто любопитен, тъй като бих искал детайлността да знам кой играе навън срещу кой играе у дома. - person Laurent; 26.11.2013
comment
Не, ще ви е необходима таблица за присъединяване, за да създадете връзката Играч - Съвпадение (нещо като има и принадлежи на много), но това е излишно във вашия случай;) - person MrYoshiji; 26.11.2013