self.update_attributes не обновляет атрибут - PullRequest
0 голосов
/ 12 августа 2010

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

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Я действительно не знаю, поможет ли это вам, но вы можете использовать increment вместо update_attributes.

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

Если вы попробуете, пожалуйста, дайте мне знать, если это сработало:]

Редактировать

Я считаю, что метод reload может решить вашу проблему!

0 голосов
/ 12 августа 2010

Я предполагаю, что ваш объект не проходит проверку, и поэтому он не сохраняется.Попробуйте использовать update_attributes! с восклицательным знаком, чтобы он выдавал ошибку и вы могли видеть, что происходит.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...