2011-10-11 50 views
0

我有兩個模型,論壇和主題,論壇有很多主題。每個都有一個活動的布爾值。當我翻轉論壇上的活動旗幟時,我希望它的主題也都翻轉旗幟。我的想法是這樣做before_save def before_save 除非self.active? self.topics.each {| topic | topic.close} 結束Rails - 試圖翻轉兒童協會的活動標誌

在主題,我已經定義了關閉方法: 高清關閉 self.active =假 self.save 結束

我是否採取錯誤的做法在這裏(我應該是做的是在其他地方,如在控制器?)我沒有得到任何錯誤,但沒有任何反應時,我將標誌設置爲false(我不一定要將所有主題設置爲活動時,將論壇設置爲活動,所以我只需要這種方式)。

謝謝

回答

0

不,你有正確的做法,你只需要輕微的推動。見下面的例子。

class Forum < ActiveRecord::Base 
    has_many :topics 
    after_save :close_topics! 

    def close! 
    self.active = false 
    self.save! 
    end 

    private 

    def close_topics! 
    self.topics.each(&:close!) unless self.active 
    end 
end 

class Topic < ActiveRecord::Base 
    belongs_to :forum 

    def close! 
    self.active = false 
    self.save! 
    end 
end 

您還可以使用ActiveRecord Observer。我個人更喜歡這個過濾器,因爲你正在以這種方式去分離你的類。而我往往喜歡關注適當分離,使..

# rails generate observer Forum 

class ForumObserver < ActiveRecord::Observer 

    def after_save (forum) 
    forum.topics.each(&:close!) unless forum.active 
    end 

end 

我假設,一旦這些記錄被激活,他們將不會活躍起來過。無論如何,用於處理相反情況的附加功能的代碼可以忽略不計。

P.S.如果您不熟悉&:handler語法,則它僅僅是映射到枚舉中每個項目的函數或變量的快捷方式。

+0

哇。我又一次被吹走了。謝謝!這正是我所需要的。順便說一句,我不確定封閉的論壇是否永遠不會重新開放,但你是對的:適應這種可能性很容易(我不認爲所有相關的主題都要重新打開,但我很高興我我打算這樣做,因爲我現在意識到我需要阻止在封閉論壇中激活主題(所以再次感謝你!) – Chip