alias_method_chain в установщике атрибута HABTM не работает

Так что у меня есть HABTM для постов и тем. A Темы сообщения HABTM и тема Сообщения HABTM. Что мне нужно сделать, это вызвать какой-то метод в сочетании с вызовом post.topics=()

Вот что я пытался сделать в Post.rb:

def topics_with_extra_stuff=(topics)
  topics_without_extra_stuff=(topics)
  extra_stuff()
end
alias_method_chain :topics=, :extra_stuff

Тем не менее, это сейчас ломается post.topics=()

Я не получу ошибку или что-нибудь, но topics() останется старым значением после его изменения topics=()

Если я подниму ошибку в topics_with_extra_stuff=, след скажет, что произошла ошибка в topics=Так что я знаю, что это там. Я тоже знаю что extra_stuff() назывался.

Вот пример вывода:

>> p = Post.last
=> #<Post id:1 ....>
>> p.topics
=> [#<Topic id:1 ....>, #<Topic id:2 ....>]
>> p.topics = [ p.topics.first ]
=> [#<Topic id:1 ....>]
>> p.topics
=> [#<Topic id:1 ....>, #<Topic id:2 ....>]

Это не должно все еще иметь 2 Темы, только 1.

Спасибо за понимание.

2 ответа

Решение

Я в конечном итоге просто с помощью обратного вызова ассоциации :before_add вместо.

У меня была такая же проблема (Rails 2.3.11), но при добавлении before_add Обратный звонок не был вариантом для меня, поэтому я продолжал искать. Наконец мне удалось заставить его работать, используя этот альтернативный способ наложения имен:

old_workflows_setter = self.instance_method(:workflows=)

define_method :workflows= do |value|
  # my code
  old_workflows_setter.bind(self).call(value)
end
Другие вопросы по тегам