has_many: à travers des questions
-
19-09-2019 - |
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:
-
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 .....
-
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?
-
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!
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