我正在调用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
类Vote
类正在调用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意识到这些内容已经改变了呢?
答案 0 :(得分:1)
我真的不知道这是否会对您有所帮助,但您可以使用increment
代替update_attributes
。
def add_to_vote_count(increment)
self.increment!(:vote_count, increment)
end
如果您尝试,请告诉我这是否有效:]
修改强>
我相信reload
方法可以解决您的问题!
答案 1 :(得分:0)
我的猜测是你的对象验证失败,这就是它不能保存的原因。尝试使用感叹号update_attributes!
,这样就会抛出错误,你可以看到最新消息。