2015-03-13 82 views
1

after_add回調has_and_belongs_to_many協會是沒有任何回調或解決以獲取belongs_to的關聯after_add功能。 解決方法之一是在保存回調函數和髒對象功能之前/之後使用。回撥爲belongs_to的關聯軌道

belongs_to :video 
after_save :after_save_task 

def after_save_task 
do_stuff if video_id_changed? 
end 

def do_stuff 
### do stuff 
end 

但我可以在do_stuff不save(true)自進入無限循環。

回答

0

看起來像是還沒有被添加添加回調has_on和belongs_to的功能。看到這個線程您的具體問題https://github.com/rails/rails/issues/586

一個骯髒的解決辦法是增加一些骯髒的屬性,如果更新已經作出建議。

這樣

belongs_to :video 
after_save :after_save_task 
attr_accessor :stuff_done 

def after_save_task 
do_stuff if video_id_changed? && !stuff_done 
end 

def do_stuff 
stuff_done = true 
### do stuff 
## Saving record here would be fine. 
end 

再次,這是一個真正的黑客,可能存在一些這方面的更好的解決方案。

+0

謝謝你,解決它的一個。我發現的另一個是使用update_column,這將避免回調。 – 2015-03-16 15:52:41

0

重寫setter方法如何? Rails的引導件具有this here

其中指出

重寫生成的方法

被納入 模型類的模塊中生成關聯方法的摘錄的exam0le,這使您可以輕鬆地使用自己的方法進行覆蓋,並使用super調用原始生成的方法。對於 例如:

class Car < ActiveRecord::Base belongs_to :owner belongs_to 
    :old_owner 

    def owner=(new_owner) 
     self.old_owner = self.owner 
     super 
    end 
    end 

如果你的模型類項目,該模塊被命名爲 項目:: GeneratedAssociationMethods。 GeneratedAssociationMethods 模塊在 (匿名)生成的屬性方法模塊之後立即包含在模型類中,這意味着 關聯將覆蓋具有相同 名稱的屬性的方法。

我明白這是一個老問題,但我無意中發現了它尋找一個類似的解決方案