Я звоню 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 понять, что материал изменился?