1

だから私は投稿とトピックの両方に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つだけです。

洞察をありがとう。

4

2 に答える 2

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
于 2011-12-05T10:46:21.140 に答える
1

:before_add代わりに、アソシエーションコールバックを使用することになりました。

于 2011-06-22T05:51:29.193 に答える