Pergunta

Eu estava usando anteriormente has_and_belongs_to_many, e se converteram ao has_many: through. Aqui está como ele olha para uma lista de jogos que podem ter muitos usuários de jogo. Com isso, eu posso fazer game.users e 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

E a minha migração de banco de dados para a tabela de junção:

create_table :game_users, :id => false do |t|
      t.column :game_id, :integer
      t.column :user_id, :integer
      t.column :player_index, :integer
    end

Eu não tenho certeza eu recebo tudo isso, por favor me ajudar a verificar meus fatos:

  1. é o = dependentes>: destruir correto? Quero dos game_users 'juntar-se entrada da tabela a ser excluída se qualquer jogo ou o usuário é destruída - mas eu não quero que os usuários sejam apagados se os jogos são excluídos e vice-versa .....

  2. O campo uniq é suposto dizer que os jogos contêm apenas usuários únicos, e os usuários só contêm jogos únicos. Isso está correto?

  3. A migração de banco de dados como antes tem: id => false. Isso ainda é a coisa certa a fazer? Tentei no console destruir um jogo, e tenho queixas sobre o id faltando ... então eu estou supondo que não e tentando entender o porquê.

Eu acho trilhos associações do Active Record muito confuso. Eu acho que eles não deveriam ser!

Foi útil?

Solução

1: Sim, isso é correto

2: A partir de documentação do em uniq :

Se for verdade, duplicatas serão omitidos da coleção. em útil conjunto com:. através

Então, sim, se você objetivo não é obter o mesmo jogo em jogos de coleção do usuário, nem o mesmo usuário em usuários de recolha de jogo, isso é correto. Está tudo explicado aqui .

Ele não vai, no entanto, evitar GameUsers duplicadas de que está sendo criado. Para isso, você precisa usar validates_ singularidade _of na GameUser-modelo :

class GameUser < ActiveRecord::Base
  validates_uniqueness_of :game_id, :scope => :user_id
end

3: Não, você não quer usar: id => false mais. Ao mudar de has_and_belongs_to_many para has_many: through, ter promovido o seu muitos-para-muitos tabela para um modelo completo - GameUser - que requer o seu próprio id

.

Embora seja velho, este ainda é um bom artigo para has_many compreensão:. através

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top