has_many: durch Fragen
-
19-09-2019 - |
Frage
Ich war vorher mit has_and_belongs_to_many und haben has_many umgesetzt: durch. Hier ist, wie es für eine Liste der Spiele sieht, dass viele Benutzer zu spielen haben. Damit kann ich game.users und user.games tun ....:
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
Und meine Datenbank-Migration für die Join-Tabelle:
create_table :game_users, :id => false do |t|
t.column :game_id, :integer
t.column :user_id, :integer
t.column :player_index, :integer
end
Ich bin nicht ganz sicher, ob ich das alles bekommen, bitte helfen Sie mir meine Fakten überprüfen:
-
Ist das abhängige =>: correct zerstören? Ich mag die ‚game_users‘ Tabelleneintrag beitreten gelöscht werden, wenn entweder das Spiel oder der Benutzer zerstört wird - aber ich will nicht, Benutzer gelöscht werden, wenn Spiele gelöscht werden und umgekehrt .....
-
Das uniq Feld soll sagen, dass Spiele nur einzelne Nutzer enthalten, und die Benutzer enthalten nur einzigartige Spiele. Ist das richtig?
-
Die Datenbankmigration nach wie vor hat: id => false. Ist das immer noch das Richtige zu tun? Ich habe versucht, in der Konsole ein Spiel zu zerstören, und bekam Beschwerden über die fehlende id ... so vermute ich nicht und versuchen zu verstehen, warum.
Ich finde Schienen aktiven Datensatz Verbände sehr verwirrend. Ich denke, sie sind nicht sein soll!
Lösung
1: Ja, das ist richtig
2: Von der Dokumentation auf uniq :
Wenn das stimmt, werden Duplikate weggelassen werden aus der Sammlung. nützlich in Verbindung mit:. durch
Also, ja, wenn Du ist nicht das Ziel das gleiche Spiel in User-Spiele-Sammlung erhält noch den gleichen Benutzer in Spiel Nutzer-Sammlung, das ist richtig. Es ist alles hier erklärt.
Es wird jedoch nicht verhindern, dass doppelte GameUsers aus erstellt werden. Dafür müssen Sie validates_ Einzigartigkeit _of im GameUser-Modell verwenden, :
class GameUser < ActiveRecord::Base
validates_uniqueness_of :game_id, :scope => :user_id
end
3: Nein, Sie möchten nicht verwenden: id => false mehr. Durch die von has_and_belongs_to_many Umstellung auf has_many: durchgehend, haben Sie gefördert Ihre many-to-many-join-Tabelle zu einem vollständigen Modell - GameUser - das seine eigenen ID erfordert
.Während es alt ist, diese ist immer noch ein guter Artikel für Verständnis has_many. durch