Если вы планируете использовать has_and_belongs_to_many
, вам, вероятно, следует перейти на использование has_many ..., :through
, так как им намного легче управлять.У вас уже есть модель Action, которая делает то, что вам нужно, без необходимости создания некоторых таблиц соединения:
class Game < ActiveRecord::Base
has_many :hands
end
class Hand < ActiveRecord::Base
has_many :actions
belongs_to :game
has_many :players,
:through => :actions,
:source => :player
end
class Action < ActiveRecord::Base
belongs_to :game
belongs_to :hand
belongs_to :player
end
class Player < ActiveRecord::Base
has_many :actions
has_many :played_games,
:through => :actions,
:as => :game
has_many :played_hands,
:through => :actions,
:as => :hand
end
Как правило, чем меньше таблиц вы задействовали в своих запросах, тем быстрее они будут выполняться.Использование любого вида JOIN
приведет к непредсказуемой производительности запросов.
Обязательно тщательно индексируйте свои таблицы и используйте оператор EXAMINE
, чтобы убедиться, что вы используете индексы при их использовании.Сканирование таблиц будет чрезвычайно болезненным, если вы загрузите это миллионами записей, и в таких играх это не займет много времени, так как одна рука включает в себя десятки действий, и типично играть десятки раздач в час.