Rotaie attività modello User has_many (osservatore), ma dovrebbe anche essere osservato
-
19-09-2019 - |
Domanda
Io corro in un problema con un modello esistente ActiveRecord::Observer
che registra vari Activities
di un User
sito. Tutto stava funzionando molto bene, fino a quando ho provato a observe
classe User
con lo stesso modello Activity
che utilizza per observe
altri modelli. Si consideri che:
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
È possibile che questo ha funzionato bene. Una query per User.activities
sarebbe tornato filari di Comment
Activities
. Appena ho aggiunto :user
al metodo observe
in ActivityObserver
e cambiato has_many :activities
nel modello User
a has_many :activities, :as => :item
, User.activities
sarebbe tornato solo le righe che erano le attività relative a tale istanza User
e non qualsiasi Comments
Perché è questo? Che cosa posso fare per ottenere questo lavoro come previsto?
Soluzione
Quando si è modificato
class User < ActiveRecord::Base
has_many :activities
end
a
class User < ActiveRecord::Base
has_many :activities, :as => :item
end
è ora guardando il campo item_id
nella tabella attività in cui il campo tipo è utente di tirare indietro le attività in cui item_id = users.id
. Prima che stava guardando il campo user_id
in attività. Dal momento che il campo item_id
e il campo tipo non possono avere due valori, è fatto in modo che un punti di attività a un utente o un commento. Non può essere entrambe le cose.