質問

以前は 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 のアクティブなレコードの関連付けは非常にわかりにくいと思います。そうあるべきではないと思います!

役に立ちましたか?

解決

1:はい、それは正しいのです。

2: UNIQ の上のドキュメント:

  

がtrueの場合、重複を省略する   コレクションから。に有用   連動:を通じて

だから、そう、あなたが目指していた場合、ユーザーのゲーム・コレクションでも正しいの試合のユーザー・コレクション、中に同一のユーザに同じゲームを得ることはありません。それはすべてここのを説明しています。

これは、しかし、作成されてから重複GameUsersを防ぐことはできません。そのためには、GameUserモデルに validates_一意_of を使用する必要があるだろう:

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

3:いいえ、あなたは使用しない:ID => falseのいずれかのより多くの。 HAS_MANYするhas_and_belongs_to_manyアソシエーションから切り替えることにより:を通じて、あなたが推進しているあなたの多対多のフルモデルへの参加 - テーブル - GameUser - 自分のIDが必要です。

。 それは古いですが、

このにはまだのために良い記事です理解にhas_many:を通じて

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top