self.update_attributes不更新属性

时间:2010-08-12 18:25:24

标签: ruby-on-rails

我正在调用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_countVote类正在调用after_create。但是,从输出中可以看出,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意识到这些内容已经改变了呢?

2 个答案:

答案 0 :(得分:1)

我真的不知道这是否会对您有所帮助,但您可以使用increment代替update_attributes

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

如果您尝试,请告诉我这是否有效:]

修改

我相信reload方法可以解决您的问题!

答案 1 :(得分:0)

我的猜测是你的对象验证失败,这就是它不能保存的原因。尝试使用感叹号update_attributes!,这样就会抛出错误,你可以看到最新消息。

祝你好运。