Вопрос

Ранее я использовал 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. Правильно ли значение dependent => :destroy?Я хочу, чтобы запись таблицы объединения 'game_users' была удалена, если либо игра, либо пользователь будут уничтожены, но я не хочу, чтобы пользователи удалялись, если игры будут удалены, и наоборот.....?

  2. Предполагается, что поле uniq указывает, что игры содержат только уникальных пользователей, а пользователи содержат только уникальные игры.Это правильно?

  3. Миграция базы данных, как и прежде, имеет:id => false .Это все еще правильный поступок?Я попытался уничтожить игру на консоли и получил жалобы на отсутствие идентификатора...так что я предполагаю, что нет, и пытаюсь понять почему.

Я нахожу ассоциации rails с активными записями очень запутанными.Я думаю, так и должно быть!

Это было полезно?

Решение

1:Да, это верно

2:Из самого документация по uniq:

Если значение true, дубликаты будут исключены из коллекции.Полезно в сочетании с :через.

Так что, да, если ваша цель не состоит в том, чтобы получить ту же игру в коллекции игр пользователя или того же пользователя в коллекции пользователей игры, это правильно.Все это объяснено здесь.

Однако это не помешает созданию дубликатов игровых пользователей.Для этого вам нужно будет использовать проверяет уникальность _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, вы повысили свою таблицу соединений "многие ко многим" до полной модели - GameUser, для которой требуется собственный идентификатор.

Пока он старый, это это все еще хорошая статья для понимания has_many :through.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top