Rails User-Modell has_many Aktivitäten (Beobachter), sondern auch beachtet werden sollte
-
19-09-2019 - |
Frage
Ich laufe in ein Problem mit einem bestehenden ActiveRecord::Observer
Modell, das verschiedene Activities
eines User
die Website aufzeichnet. Alles funktioniert wirklich gut, bis ich versuchte, die observe
Klasse mit dem gleichen User
Modell Activity
, die es verwendet andere Modelle observe
. Bedenken Sie, dass:
class Activity < ActiveRecord::Base
belongs_to :user
belongs_to :item, :polymorphic => true
end
class ActivityObserver < ActiveRecord::Observer
observe :billing, :call, :vanity_number
end
class User < ActiveRecord::Base
has_many :comments
has_many :activities
end
class Comment < ActiveRecord::Base
belongs_to :user
has_many :activities, :as => :item
end
Das oben hat gut funktioniert. Eine Abfrage für User.activities
zurückkehren würde Reihen von Comment
Activities
. Sobald ich :user
zur observe
Methode in ActivityObserver
und geändert has_many :activities
im User
Modell hinzugefügt has_many :activities, :as => :item
würde User.activities
nur Zeilen zurück, Aktivitäten zu dieser User
Instanz im Zusammenhang waren und nicht jeder Comments
Warum ist das? Was kann ich tun, um diese Funktion zu erhalten, wie erwartet?
Lösung
Wenn Sie geändert
class User < ActiveRecord::Base
has_many :activities
end
class User < ActiveRecord::Base
has_many :activities, :as => :item
end
es sucht nun am item_id
Feld in der Tabelle Aktivitäten, wo der Typ Feld Benutzer ist es, Aktivitäten zurück zu ziehen, wo item_id = users.id
. Bevor es in Aktivitäten im Bereich user_id
suchen. Da das item_id
Feld und Typ-Feld nicht zwei Werte haben kann, Sie haben es so, dass eine Aktivität Punkte an einen Benutzer oder einen Kommentar. Es kann nicht beides sein.