문제

이전에 HAS_AND_BELONGS_TO_MANY를 사용했으며 HAS_MANY로 변환했습니다. 많은 사용자가 플레이 할 수있는 게임 목록을 찾는 방법은 다음과 같습니다. 이를 통해 Game.Users 및 User.Games를 수행 할 수 있습니다 .... :

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. UNIQ 필드는 게임에 고유 한 사용자 만 포함되어 있으며 사용자는 고유 한 게임 만 포함한다고 말합니다. 그 맞습니까?

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

나는 Rails Active Record Association이 매우 혼란 스럽습니다. 나는 그들이되어서는 안된다고 생각합니다!

도움이 되었습니까?

해결책

1 : 네, 맞습니다

2 : Uniq에 대한 문서:

사실이라면 컬렉션에서 복제가 생략됩니다. 다음과 함께 유용합니다.

그렇습니다. 목표가 사용자의 게임 수집에서 동일한 게임을 얻지 못하거나 Game의 사용자 수집에서 동일한 사용자를 얻지 못하면 맞습니다. 그것은 모두 설명되어 있습니다 여기.

그러나 중복 게임 사용자가 생성되는 것을 방해하지는 않습니다. 이를 위해서는 사용해야합니다 Validates_ 고유성 _of GameUser 모델에서 :

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

3 : 아니요, 당신은 사용하고 싶지 않습니다 : id => 더 이상 허위. has_and_belongs_to_many에서 has_many로 전환함으로써 : 당신은 자체 ID가 필요한 전체 모델 인 GameUser로 다수의 조인 테이블을 홍보했습니다.

늙었지만 이것 Has_many를 이해하기위한 좋은 기사입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top