HABTM属性的setter上的alias_method_chain无法正常工作

时间:2011-06-20 20:59:48

标签: ruby-on-rails override has-and-belongs-to-many setter alias-method-chain

所以我有帖子和主题的HABTM。 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 个答案:

答案 0 :(得分:2)

我遇到了同样的问题(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

答案 1 :(得分:1)

我最后只使用了关联回调:before_add