2012-01-16 5 views
0

저는 루비를 실험하기 위해 축구 게임을 만들려고합니다. 협회는 다음과 같습니다 :루비의 다 대다 관계에서 역할을 할당하는 가장 좋은 방법은 무엇입니까?

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를 메소드에 보내는 순간 어떻게 정의해야한다고 생각 하나? 문제는 루비가 내가 배우는 첫 번째 OOL이라는 것입니다. 클래스 및 객체와 캡슐화 및 변수 등을 이미 배웠지 만 메소드에 대한 추가 지침이 필요합니다. 미리 감사드립니다.

답변

1

여러분의 모델이 ActiveRecord :: Base를 하위 클래스로 가질 때 모든 속성을 설정하는 데 좋은 초기화 메소드가 있으므로 initialize 메소드를 사용하지 않을 것입니다.

그러나 이와 같이 할 수 있습니다.

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 

컨트롤러에서 다음

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 

나는 기본적으로 사용자의 관계를 업데이트 할 하나의 옵션을 수락하거나 업데이트 매개 변수의 일반적인 해시를 받아 경기 컨트롤러 때문에 업데이트 작업을 그것을 설정 .

+0

오타가 있습니까,'self.home_user = User.find (home_user)'대신'self.home_user = User.find (home_user_id)'가되어서는 안됩니까? 그럼에도 불구하고 나는 구문을 얻는다. 고맙습니다. 그러나 마지막 질문 : 왜 create 메소드 나 new 메소드 대신 update 메소드를 사용 했습니까? 새로운 메소드와 create 메소드 (및 콜백)의 차이점은 나에게 복잡해 보입니다. – barerd

+0

나는 home_user와 away_user라는 변수를 가지고 있기 때문에 잘 동작한다. 그것들은 find 메서드에 전달됩니다. 그들을 _id로 이름을 바꿀 수 있습니다. 아마도 더 이해할 수 있습니다. 나는 그 경기가 존재했다는 가정하에 행동했다. 새로운 것을 만들고 동시에 사용자를 선택한다면, 비계 이후에 얻는 기본 생성 동작을 거의 사용할 수 있습니다. 실제로 필드 이름을 home_user_id 및 : away_user_id로 전달하는 한 업데이트를 기본값으로 둘 수 있습니다. 나는 단지 객체 자체를 할당하는 방법을 보여주기를 원했다. – agmcleod

+0

이 늦은 응답에 대해 유감스럽게 생각하지만 업데이트 내용을 이해했지만 def_users에서 away_user_id를 오해했다고 생각합니다. 'self.away_user_id = User.find (away_user)'라면 상대방 선택보기의 @away_user_id 인스턴스 변수에 다른 사용자의 (상대방) ID를 할당하는 방법을 찾아야합니다 (일치하면/new.html.erb가됩니다. 말,), 어떤 업데이 트 또는 컨트롤러에서 새 메서드를 호출 할거야? 그러나 일치/새보기가 사용자 모델이 아닌 일치하는 모델에 속한 경우 어떻게됩니까? – barerd

관련 문제