2011-04-13 75 views
2

更新:當屬性更新爲nil時,爲什麼before_save/after_save沒有被觸發?以及如何觸發它?

好的。我有另一種方式來描述這一點。我正在保存一個項目,並且Base.save被稱爲此項目及其所有子項目。而且由於其中一些不再是這個項目的孩子,因爲我沒有選中它們,所以save沒有被調用。這聽起來有點清楚。但仍然用另一個詞來描述同樣的問題。爲什麼如果一條記錄被更新(雖然有些奇怪的方式),並且它的parent_id被更改了,但是rails不會使它成爲更新嗎?

============================================== ========================

我的項目與自己有多對一的關聯。我想在項目更改其父項時爲項目創建註釋。當item.superitem_id從零變爲某個ID或從某個ID變爲另一個ID時,一切正常。但是,當item.superitem_id從某個id變爲零時什麼也沒有發生。


在第一種情況日誌顯示:

UPDATE "items" SET "superitem_id" = 3, "updated_at" = '2011-04-12 23:07:05.566609' WHERE "items"."id" = 5 

而在第二個:

UPDATE "items" SET "superitem_id" = NULL WHERE "items"."superitem_id" = 3 AND "items"."id" 



大二項目肯定是改變了。但是爲什麼它沒有更新並且before_save沒有被調用?


型號:

class Item < ActiveRecord::Base 

    before_save :generate_comments 

    has_many :subitems, :class_name => "Item", :foreign_key => "superitem_id" 
    belongs_to :superitem, :class_name => "Item" 

    private 
    def generate_comments 
     @comment = self.comments.build(:content => "Test: #{self.superitem_id}") 
     @comment.save 
    end 

end 

查看與複選框從 「HABTM複選框」 railscast:

<% for subitem in @potential_subitems %> 
    <%= check_box_tag "item[subitem_ids][]", subitem.id, @item.subitems.include?(subitem) %> 
<% end %> 

和控制器:

def update 
    params[:item][:subitem_ids] ||= [] 
    @item = Item.find(params[:id]) 
    @item.update_attributes(params[:item]) 
end 

回答

3

我大膽猜測是,在第二種情況您的關聯被保存(偶數儘管它是同一張表),所以Rails並沒有將它看作是「自我」的更新。檢查這個帖子給力上「觸摸」一個belongs_to的回調:

"Before Save" callback on associations

+1

是它解決了嗎? – charlysisto 2011-10-12 20:33:39

+0

對於Rails 4及以下版本,您的回調必須在Rails 5中返回'true' ...,如果您的回調失敗,則必須明確引發異常,因此回調鏈會中止。 – 2017-06-30 12:54:59

相關問題