2013-08-05 2 views
1

У меня есть иерархия моделей, для которых я пытаюсь каскадировать событие touch.after_touch callback запускается несколько раз

class Category < ActiveRecord::Base 
    has_many :posts 

    after_touch :do_stuff 

    def do_stuff 
     # do stuff... 
    end 
end 

class Post < ActiveRecord::Base 
    belongs_to :category, :touch => true 
    has_many :comments, :dependent => :destroy 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post, :touch => true 
end 

У меня есть форму для публикации, которая создает новый комментарий через nesteed_attributes. Когда это событие происходит, метод after_touch класса Category запускается 4 раза подряд подряд (в миллисекундах), и я немного теряю, чтобы понять, почему.

На мой взгляд, обратный вызов должен быть уволен только один раз для транзакции? Я также замечаю, что в таких случаях, как уничтожение сообщения, обратный вызов запускается для сообщения, а каждый из комментариев, который уничтожается, приводит к множеству звонков.

Это нормальное поведение? Ожидается? Есть ли способ обойти это? Это ошибка в Rails?

+0

может быть, вы хотите использовать 'after_initialize'? – MrYoshiji

+0

Извините бутон - это Rails 4.0.0, я обновляю теги за мгновение. – SirRawlins

+0

after_touch - это обратный вызов, который вы хотите использовать? или это метод, который вам нужно применить к объекту? – rmagnum2002

ответ

1

Похоже, что это «по дизайну» в Rails на данный момент. Там также, похоже, не существует какого-либо непосредственного плана, чтобы изменить это, поэтому на данный момент, если вы планируете использовать: касатьться и требовать только один обратный вызов, вам нужно посмотреть другой вариант.

https://github.com/rails/rails/issues/8759

2
class Category < ActiveRecord::Base 
    has_many :posts 

    after_touch :do_stuff 

    def do_stuff 
     # do stuff... 
    end 
end 

class Post < ActiveRecord::Base 
    belongs_to :category 
    has_many :comments, :dependent => :destroy 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

posts_controller 

def update 
    ... 
    if @post.update 
    @post.category.touch 
    else 
    ... 
    end 

end 
+0

После долгого обсуждения с rmagnum2002 мы не смогли определить, почему обратный вызов запускался несколько раз, независимо от того, как далеко мы отменили код На данный момент мы решили отвести сенсорное решение от определения связи и к контроллеру. – SirRawlins

Смежные вопросы