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