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