6

以前は has_and_belongs_to_many を使用していましたが、has_many :through に変換しました。多くのユーザーがプレイできるゲームのリストを検索する方法を次に示します。これで、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. 従属 => :destroy は正しいですか? ゲームまたはユーザーが破棄された場合に「game_users」参加テーブル エントリを削除したいのですが、ゲームが削除された場合やその逆の場合にユーザーを削除したくありません。

  2. uniq フィールドは、ゲームには一意のユーザーのみが含まれ、ユーザーには一意のゲームのみが含まれることを示すことになっています。あれは正しいですか?

  3. 以前のデータベースの移行には :id => false があります。それでもそれは正しいことですか?コンソールでゲームを破壊してみましたが、ID が見つからないという苦情がありました。

Rails のアクティブ レコードの関連付けは非常にわかりにくいと思います。私は彼らがすべきではないと思います!

4

1 に答える 1

5

1:はい、その通りです

2:uniqのドキュメントから:

trueの場合、重複はコレクションから除外されます。:throughと組み合わせて使用​​すると便利です。

したがって、はい、ユーザーのゲームコレクションで同じゲームを取得することでも、ゲームのユーザーコレクションで同じユーザーを取得することでもない場合は、その通りです。それはすべてここで説明されています。

ただし、重複するGameUserの作成を妨げることはありません。そのためには、GameUser-modelで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)に昇格させました。

古いものですが、これはhas_many:throughを理解するための良い記事です。

于 2009-11-10T20:33:54.170 に答える