1

投稿とトピックの両方にHABTMがあります。 A HABTMポスト、およびトピックHABTMポストを参照してください。しかし、これは今私が勝ったpost.topics=()HABTM属性のセッターのalias_method_chainが機能しない

を壊し

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

:私は何をする必要があることはこれは私がPost.rbでやってみたことあるpost.topics=()

を呼び出すことと併せて、いくつかのメソッドを呼び出すことです何もエラーはありませんが、topics()は変更後も以前の値になりますtopics=()

topics_with_extra_stuff=にエラーが発生した場合、トレースにはtここにはtopics=のエラーがあったので、そこに入るのが分かります。私はまたが呼ばれたことを知っています。

は、ここでは、出力の例です:

>> 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

感謝を持つべきではありません。

答えて

1

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

2

私はこの同じ問題(Rails 2.3.11)を持っていましたが、before_addコールバックを追加することは私の選択肢ではありませんでした。最後に、私はそれがエイリアシングのこの代替方法を使用して動作させるための管理:レール3.2のよう

old_workflows_setter = self.instance_method(:workflows=) 

define_method :workflows= do |value| 
    # my code 
    old_workflows_setter.bind(self).call(value) 
end 
+2

私はあなたがそれを行う必要がありますとは思わない - 連想アクセサをモジュール内に作成されますので、あなたのクラスに含まsuper()を再定義して呼び出すことができるはずです –

関連する問題