has_many :質問を通じて
-
19-09-2019 - |
質問
以前は 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
これをすべて理解できているかどうかよくわかりません。事実を確認するのを手伝ってください。
依存 => :destroy は正しいですか?ゲームまたはユーザーのいずれかが破棄された場合、「game_users」結合テーブル エントリが削除されるようにしたいのですが、ゲームが削除された場合にユーザーが削除されることは望ましくありません。また、その逆も同様です。?
uniq フィールドは、ゲームには一意のユーザーのみが含まれ、ユーザーには一意のゲームのみが含まれることを示すことになっています。あれは正しいですか?
以前と同様にデータベース移行では :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:を通じて