kleintippen: Ruby on Rails HABTM destroy relationship
Bei einer has_one Beziehung zwischen Models gibt es die Option :dependent => :destroy, womit sich alle Assoziationen löschen, sobald das Vaterelement gelöscht wird. Was ist nun mit einer has_and_belongs_to_many also ner n:n Assoziation? Mit destroy_all werden alle bin Beziehung stehenden Daten gelöscht. Manchmal ist es jedoch notwenidg nur die Daten der Assoziationstabelle zu entfernen und manchmal hat nun diese Assoziationstabelle keine eigene ID, so kommt man mit dem Standardbefehlssatz nicht weiter. Eine Lösung ist es folgende optionen zu verwenden:
1 2 | :join_table => :assoziationstabelle, :delete_sql => 'DELETE FROM assoziationstabelle WHERE assoziatiation1_id = #{id}' |
Also das ganze nochmal als Beispiel, denn ein Code sagt mehr als tausend worte.
Wir haben drei Models *cool*, die die Verbindung zwischen Bneutzer und Benutzerrollen darstellt. Rollen und Benutzer haben eine n:n-Beziehung. Diese sehen so aus:
Das Benutermodel:
class User < ActiveRecord::Base has_and_belongs_to_many :roles end
Die Assoziationstabelle, die keine eigene id hat, sondern als Primärschlüssel die Kombination aus role_id und user_id:
class RolesUser < ActiveRecord::Base end
…und die Rolle:
class Role < ActiveRecord::Base has_and_belongs_to_many :users end
Nun will ich die roles_user löschen, wenn ich einen Benuztzer lösche. Also dann das User-Model erweitern um:
class User < ActiveRecord::Base has_and_belongs_to_many :roles, :join_table => :roles_users, :delete_sql => 'DELETE FROM roles_users WHERE user_id = #{id}' end
fertig ist der lack!
Am 26. July 2008 um 03:51 Uhr
“ein Code sagt mehr als tausend worte”
Prinzipiell gebe ich dir da natürlich kompletten Kredit!
Aber: Wir beide haben auch ein Negativ-Beispiel während unserer gemeinsamen Beschäftigung bei der IVV-J**a miterlebt.