2009-11-10 5 views
6

이전에 has_and_belongs_to_many를 사용했으며 has_many : through로 변환했습니다. 다음은 많은 사용자가 게임을 즐길 수있는 게임 목록을 찾는 방법입니다. 이와 함께, 나는 .... game.users 및 user.games을 수행 할 수 있습니다has_many : 질문을 통해

class Game < ActiveRecord::Base 
has_many :game_users, :dependent => :destroy 
has_many :users, :through => :game_users, :uniq => true 
end 

class User < ActiveRecord::Base 
has_many :game_users, :dependent => :destroy 
has_many :games, :through => :game_users, :uniq => true 
end 

class GameUser < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :user 
end 

그리고 조인 테이블에 대한 내 데이터베이스 마이그레이션 :

create_table :game_users, :id => false do |t| 
     t.column :game_id, :integer 
     t.column :user_id, :integer 
     t.column :player_index, :integer 
    end 

내가 모든 확실히 확실하지 오전을 이 사실을 확인하는 데 도움주세요 :

  1. 의존성 => : 파괴가 정확합니까? 게임이나 사용자가 파괴되면 'game_users'조인 테이블 항목을 삭제하고 싶습니다. 그러나 게임을 삭제하면 사용자가 삭제되는 것을 원하지 않습니다. 그 반대도 마찬가지입니까?

  2. 유니 필드는 게임에 고유 사용자 만 포함되어 있으며 사용자는 고유 한 게임 만 포함한다고 가정합니다. 그 맞습니까?

  3. 이전과 같이 데이터베이스 이전에는 : id => false가 있습니다. 그것은 여전히 ​​옳은 일입니까? 나는 콘솔에서 게임을 파괴하려고 시도했고, 실종 된 이드에 대한 불만을 얻었다. 그래서 나는 왜 그런지 추측하고 이유를 이해하려고 노력하고있다.

레일스 활성 레코드 연결이 매우 혼란 스럽습니다. 나는 그들이 있어야하기로되어 있지 않다고 생각한다!

+0

당신의 사용법 : dependent => : 파괴가 정확합니다. –

답변

5

1 : 네,

이 맞습니다 다음 documentation on uniq에서 :

true의 경우, 중복 컬렉션에서 생략한다. 유용합니다 와 함께 : through.

예, 게임 사용자 컬렉션에서 사용자 게임 컬렉션이나 동일한 사용자가 동일한 게임을 얻지 못하도록하려는 경우 맞습니다. 모두 설명 된 바는 here입니다.

그러나 중복 된 게임 사용자가 생성되는 것을 방지하지는 않습니다. 이를 위해, 당신은 GameUser 모델에 validates_ uniqueness _of를 사용해야하는 것 :

class GameUser < ActiveRecord::Base 
    validates_uniqueness_of :game_id, :scope => :user_id 
end 

3 : 아니, 당신은 사용하지 않으 : ID => false를 더 이상. has_and_belongs_to_many에서 has_many : through로 전환하면 다 대다 조인 테이블을 고유 한 ID가 필요한 전체 모델 인 GameUser로 승격했습니다.

오래되었지만 this은 여전히 ​​has_many : through를 이해하는 데 유용한 자료입니다.