Question

j'utilisais déjà has_and_belongs_to_many, et ont converti en has_many: par. Voici comment il recherche une liste de jeux qui peuvent avoir de nombreux utilisateurs de jouer. Avec cela, je peux faire game.users et 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

Et ma migration de base de données pour la table de jointure:

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

Je ne suis pas sûr que je reçois tout cela, s'il vous plaît aidez-moi vérifier mes faits:

  1. est la personne à charge =>: détruire correct? Je veux rejoindre l'entrée de la table des « game_users » à supprimer si soit le jeu ou l'utilisateur est détruit - mais je ne veux pas que les utilisateurs à supprimer si les jeux sont supprimés et vice versa .....

  2. Le champ uniq est censé dire que les jeux ne contiennent que des utilisateurs uniques, et les utilisateurs ne contiennent que des jeux uniques. Est-ce exact?

  3. La migration de base de données comme auparavant: id => false. Est-ce toujours la bonne chose à faire? J'ai essayé dans la console détruire un jeu, et nous avons eu des plaintes au sujet de l'id manquant ... donc je devine pas et d'essayer de comprendre pourquoi.

Je trouve rails associations de disques actifs très déroutant. Je suppose qu'ils ne sont pas censés être!

Était-ce utile?

La solution

1: Oui, c'est exact

2: De la sur uniq :

  

Si cela est vrai, les doublons seront omis   de la collection. utile dans   conjointement avec:. par

Alors, oui, si vous avez l'intention est d'obtenir pas le même jeu dans les jeux-collection de l'utilisateur, ni le même utilisateur dans les utilisateurs de collecte de jeu, c'est exact. Tout cela est expliqué .

Il ne sera pas, cependant, empêcher GameUsers double d'être créé. Pour cela, vous aurez besoin d'utiliser validates_ unicité _de dans le GameUser modèle :

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

3: Non, vous ne voulez pas utiliser: id => false plus. En passant de has_and_belongs_to_many à has_many: à travers, vous avez promu vos nombreux à se joindre à la table beaucoup à un modèle complet - GameUser - ce qui nécessite son propre id

.

Alors qu'il est vieux, cette est encore un bon article pour compréhension has_many:. par

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top