Обратные вызовы Ассоциации Rails не работают при создании записей другим способом - PullRequest
4 голосов
/ 26 августа 2011

Это моя User модель и ее Subscription:

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :subscriptions, :before_add => :cancel_subscriptions!

  def cancel_subscriptions!(new_subscription=nil)
    subscriptions.each(&:cancel!)
  end
end

# app/models/subscription.rb
class Subscription < ActiveRecord::Base
  belongs_to :user
end

Итак, когда я делаю some_user.subscriptions.create, он выполняет обратный вызов :cancel_subscriptions!, и тогда я счастлив. Но потом я делаю Subscription.create :user => some_user обратный вызов, кажется, не вызывается, и мне грустно, очень, очень грустно.

Есть ли способ убедиться, что обратный вызов выполняется при создании Subscription, связанного с User?

PD: Мне бы очень не хотелось писать :before_create в моей Subscription модели, потому что я думаю, что отмена всех подписок должна быть User обязанностью модели.

1 Ответ

2 голосов
/ 08 сентября 2012

Технически, есть опция :inverse_of для belongs_to, которая должна справиться с этой ситуацией. В частности, сообщите другой стороне ассоциации об изменениях на этой стороне. Но это работает, только если другая сторона has_one. Это не ясно из документации, но вы можете увидеть его источник .

Так что на данный момент нет способа заставить его работать автоматически.

Примечание на PD: вы действительно хотите перенести функциональность подписки с модели User. Управление подписками в пользовательской модели увеличивает сцепление. И так как у вас есть модель подписки в любом случае, заставьте ее выполнять свою работу и управлять подписками для одного пользователя. Также before_add не очень хорошее место для управления подписками. Вы выполняете разрушительное действие в hook_that, который выполняется до того, как какой-либо ресурс был сохранен. То есть вы можете отменить все подписки, и ваша новая подписка не пройдет проверку. Таким образом, вы потеряли старую подписку (вы не знаете, какая была активной ранее), и у вас есть недействительная новая подписка, которую нельзя сохранить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...