Пользовательская модель Rails имеет множество действий (наблюдатель), но также должна соблюдаться
-
19-09-2019 - |
Вопрос
Я столкнулся с проблемой с существующим ActiveRecord::Observer
модель, которая записывает различные Activities
из a User
сайт.Все работало действительно хорошо, пока я не попытался observe
в User
класс с тем же Activity
модель, которую он использует для observe
другие модели.Подумайте об этом:
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
Все вышесказанное сработало нормально.Запрос на User.activities
вернул бы строки из Comment
Activities
.Как только я добавил :user
к тому observe
метод в ActivityObserver
и изменился has_many :activities
в User
модель для has_many :activities, :as => :item
, User.activities
возвращал бы только строки, которые были действиями, относящимися к этому User
экземпляр и не Любой Comments
Почему это происходит?Что я могу сделать, чтобы все заработало должным образом?
Решение
Когда ты изменился
class User < ActiveRecord::Base
has_many :activities
end
Для
class User < ActiveRecord::Base
has_many :activities, :as => :item
end
теперь он смотрит на item_id
поле в таблице activities, где поле type - Пользователь, для возврата activities, где item_id = users.id
.До того, как он смотрел на user_id
поле для деятельности.С тех пор как item_id
поле и тип поля не могут иметь двух значений, вы сделали так, чтобы действие указывало либо на пользователя, либо на комментарий.Это не может быть и то, и другое.