2009-11-10 6 views
6

以前はhas_and_belongs_to_manyを使用していましたが、has_many:throughに変換されました。ここでは、多くのユーザーが遊ぶことができるゲームのリストを探す方法です。これで、私は.... game.usersとuser.gamesを行うことができます:結合テーブルのhas_many:through questions

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について苦情を受けました...だから、私は推測していないし、理由を理解しようとしています。

非常に混乱しているレールのアクティブなレコードの関連付けが見つかりました。彼らはそうでないと思うよ!

+0

あなたの用法:依存=>:破棄は正しいです。 –

答えて

5

1:はい、それは

2正しいです:documentation on uniqから:

真、重複が省略された場合 コレクションから。 と併用すると便利です。

ゲームのユーザーコレクションで同じゲームをしたり、ゲームのユーザーコレクションで同じユーザーを目標に設定していない場合は正しくあります。それはすべて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に切り替えると、多対多のジョイン・テーブルをフル・モデル(GameUser)に昇格させました。これには独自のIDが必要です。

古ければ、thisはまだhas_many:throughを理解するのに良い記事です。