2010-08-12 112 views
0

我打電話給update_attributes但它似乎並沒有改變對象。self.update_attributes不更新屬性

def add_to_vote_count(increment) 
    vc = vote_count ? vote_count : 0 
    puts "CALLED a_t_v_c(#{increment}), NEW VOTE COUNT SHOULD BE #{vc + increment}" 
    self.update_attributes(:vote_count => (vc + increment)) 
    end 

下面是一些控制檯測試:

ruby-1.8.7-p299 > p = Factory(:playlist) 
=> #<Playlist id: 56, user_id: 0, message: "Lorem ipsum dolor sit amet, consectetur adipisicing...", title: "Ipsum Dolor", flag: 2, created_at: "2010-08-12 18:18:51", updated_at: "2010-08-12 18:18:51", moderation_score: 0, photo_file_name: nil, photo_content_type: nil, photo_file_size: nil, photo_updated_at: nil, category_id: nil, widget_id: 22100001, permalink: #<ActiveSupport::Multibyte::Chars:0x102feba48 @wrapped_string="ipsum-dolor-27">, cached_tag_list: "", vote_count: 0> 

ruby-1.8.7-p299 > p.vote_count 
=> 0 
ruby-1.8.7-p299 > p.votes 
=> [] 
ruby-1.8.7-p299 > p.votes << Vote.new(:vote => true) 
CALLED a_t_v_c(1), NEW VOTE COUNT SHOULD BE 1 


VOTE CREATED 

=> [#<Vote id: 235, vote: true, voteable_id: 56, voteable_type: "Playlist", voter_id: nil, voter_type: nil, created_at: "2010-08-12 18:19:09", updated_at: "2010-08-12 18:19:09">] 

ruby-1.8.7-p299 > p.votes 
=> [#<Vote id: 235, vote: true, voteable_id: 56, voteable_type: "Playlist", voter_id: nil, voter_type: nil, created_at: "2010-08-12 18:19:09", updated_at: "2010-08-12 18:19:09">] 

ruby-1.8.7-p299 > p.vote_count 
=> 0 

ruby-1.8.7-p299 > p 
=> #<Playlist id: 56, user_id: 0, message: "Lorem ipsum dolor sit amet, consectetur adipisicing...", title: "Ipsum Dolor", flag: 2, created_at: "2010-08-12 18:18:51", updated_at: "2010-08-12 18:18:51", moderation_score: 0, photo_file_name: nil, photo_content_type: nil, photo_file_size: nil, photo_updated_at: nil, category_id: nil, widget_id: 22100001, permalink: #<ActiveSupport::Multibyte::Chars:0x102feba48 @wrapped_string="ipsum-dolor-27">, cached_tag_list: "", vote_count: 0> 

任何想法,爲什麼沒有什麼是越來越保存?我沒有得到任何錯誤,調用方法通常會返回「正確」的結果。

ruby-1.8.7-p299 > p.update_attributes(:vote_count => 100) 
=> true 
ruby-1.8.7-p299 > p.vote_count 
=> 100 
ruby-1.8.7-p299 > p.add_to_vote_count(10) 
CALLED a_t_v_c(10), NEW VOTE COUNT SHOULD BE 110 
=> true 
ruby-1.8.7-p299 > p.vote_count 
=> 110 

我可以看到的唯一區別是,add_to_vote_count在其after_create方法被調用由Vote類。正如你從輸出中看到的,儘管如此,add_to_vote_count肯定會被調用。

#in vote.rb 
    def after_create 
    voteable.add_to_vote_count(vote ? 1 : -1) 
    puts "\n\nVOTE CREATED\n\n" 
    end 

編輯:其實,事實證明,該對象得到更新,但我引用不是。也就是說,p返回沒有投票的舊版本,但Playlist.find(p.id)返回正確的一個。我認爲這是由於緩存(Rails不希望再次訪問數據庫中的內存應該有的項目),那麼我如何強制Rails意識到這些東西改變了?

+0

好吧,我已根據您的編輯更新了我的答案! – 2010-08-12 19:22:47

回答

1

我真的不知道這是否會幫助你,但你可以使用increment而不是update_attributes

def add_to_vote_count(increment) 
    self.increment!(:vote_count, increment) 
end 

如果你嘗試,請讓我知道如果這個工作:]

編輯

相信reload方法能夠解決您的問題!

+0

這並沒有奏效......但是,我想我已經發現了這個問題。它看起來像vote.voteable不同於它附加到的實際播放列表...讓我們說,p是一個投票的播放列表,然後p.votes.first.voteable不等於p。奇怪的;我現在需要做一些思考。 – unsorted 2010-08-12 18:47:08

+0

好的,編輯原帖以澄清問題。感謝您的建議; 「增量」會做你說過的事情,它看起來比我之前乾淨一點,所以我會用它。 – unsorted 2010-08-12 18:53:59

+0

'reload'幫助控制檯輸出。其中一件令人困惑的事情是,我認爲我必須在'increment'之後調用'save'?最後,這個問題與'vote_fu'有關,它已經向對象添加了一個名爲'vote_count'的屬性(我認爲),所以出現了名稱衝突。重命名爲'vote_cache'效果更好。感謝您的建議。 – unsorted 2010-08-12 22:49:16

0

我的猜測是你的對象失敗驗證,這就是爲什麼它沒有保存。嘗試使用感嘆號update_attributes!,以便引發錯誤,並且可以看到最新消息。

祝你好運。

+0

我試過這個並確認驗證沒問題。這是一個名稱空間衝突(請參閱下面的註釋)。謝謝你的建議,男人。 – unsorted 2010-08-12 22:49:59

+0

update_attribute跳過驗證! – 2013-03-10 12:05:45