Как лучше распределять роли в отношениях «многие ко многим» в ruby? - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь создать футбольную игру, чтобы поэкспериментировать с рубином. Ассоциации ниже:

Match.rb

class Match < ActiveRecord::Base
  belongs_to :home_user, :class_name => 'User', :foreign_key => 'home_user_id'
  belongs_to :away_user, :class_name => 'User', :foreign_key => 'away_user_id'

User.rb

class User < ActiveRecord::Base
  has_many :home_matches, :class_name => 'Match', :foreign_key => 'home_user_id'
  has_many :away_matches, :class_name => 'Match', :foreign_key => 'away_user_id'

Мой вопрос: как я могу назначить home_user и away_user для совпадения? Я думал о методе инициализации, как:

  def initialize(home_user, away_user)
    @home_user = User.find(1)
    @away_user = User.find(2)
  end

а как поставить код, чтобы найти пользователя, решившего сопоставить и предложившего сопоставление? Я полагаю, что я должен определить их в тот момент, когда пользователь нажимает ссылку "set_match" и отправляет эти user_ids методу, но как? Проблема в том, что ruby ​​- это первое OOL, которое я изучаю. Я уже выучил классы, объекты, инкапсуляцию, переменные и т. Д., Но мне нужны дальнейшие указания по методам. Заранее спасибо.

1 Ответ

1 голос
/ 17 января 2012

Я бы не использовал метод initialize, поскольку, когда ваша модель подклассов ActiveRecord :: Base, у нее есть хороший метод инициализации для установки всех атрибутов.

Однако вы можете сделать что-то подобное.

def set_users(home_user, away_user)
  if home_user && away_user
    self.home_user = User.find(home_user)
    self.away_user = User.find(away_user)
    true
  else
    false
  end
end

Тогда в вашем контроллере

def update
  @match = Match.find(params[:id])
  if @match.set_users(params[:home_user_id], params[:away_user_id])
    @match.save
  else
    @match.update_attributes(params[:match])
  end
end

Я в основном настроил его так, чтобы действие обновления на контроллере совпадений принимало один параметр для обновления отношений пользователя или просто принимало обычный хэш параметров обновления.

...