Использование обратного вызова в модели, которая изменяет столбец другой модели (Rails)? - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть модель с именем Голосование , и вот как выглядит voice.rb :

class Vote < ActiveRecord::Base
  belongs_to :votable, :polymorphic => true
  belongs_to :user

  before_create :update_total

  protected

  def update_total
    self.total ||= 0
    self.total += self.polarity
  end
end

(это полиморфно, потому что оно также принадлежит другомуМодель называется Комментарий ).

Каждый раз при создании голоса значение итога обновляется.Например, Vote.create(:polarity => 2) будет выдавать :polarity => 2, :total => 2

Я просто понимаю, что это не имеет смысла, потому что :polarity всегда будет равно :total.Что я на самом деле хочу сделать, так это иметь total для модели, которой принадлежит Голосовать ;в этом случае сообщение и комментарий ( голосование принадлежит сообщению и сообщение имеет много голосов), так что каждый раз при создании голосования,столбец total в сообщении будет обновлен.Вот так:

13 мая

Post.total = 3 (:id => 2)

Vote.polarity = 1 (:id => 1)
Vote.polarity = -1 (:id => 2)
Vote.polarity = 3 (:id => 3)

14 мая

Post.total = 4 (:id => 2)

Vote.polarity = 1 (:id => 1)
Vote.polarity = -1 (:id => 2)
Vote.polarity = 3 (:id => 3)
Vote.polarity = 1 (:id => 4)

1 Ответ

2 голосов
/ 07 февраля 2012

Вам необходимо обновить итоговое значение голосового объекта следующим образом:

def update_total
  if self.votable.class.column_names.include?("total")
    total_average = self.votable.total ||= 0
    self.votable.update_attribute(:total, total_average + self.polarity)
  end
end

или вы можете использовать условный обратный вызов, как @Sandip говорит:

before_create :update_total, :if => defined_total

def defined_total
  self.votable.class.column_names.include?("total")
end

def update_total
  total_average = self.votable.total ||= 0
  self.votable.update_attribute(:total, total_average + self.polarity)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...