Как мне обновить этот столбец базы данных? - PullRequest
1 голос
/ 19 марта 2011

Итак, у меня есть метод в моей модели видео:

def rank_sum(score, video)
 ...
 ...
end

, которое возвращает значение, которое я хочу сохранить в своей базе данных для конкретного видео в столбце rank_sum.

Я также заказываю свои видео так:

default_scope order('videos.rank_sum')

Теперь мой вопрос: как мне обновить столбец rank_sum? С обратным вызовом? Как часто я должен обновлять это?

Ответы [ 3 ]

1 голос
/ 19 марта 2011

Я бы порекомендовал вам не создавать методы, конфликтующие с какими-либо автоматически созданными атрибутами вашей модели, поскольку это будет мешать встроенным функциям Rails, таким как генерация форм.

Вы можетепросто перепишите ваш метод следующим образом:

def update_rank_sum(score)
  new_rank = self.rank_sum + score # Or substitute whatever logic is necessary here.
  update_attribute :rank_sum, new_rank
end

Это будет обновлять значение в базе данных (при необходимости) каждый раз, когда вызывается метод update_rank_sum.

Если вы хотите отложитьОбновив значение rank_sum до более позднего момента, вы можете изменить реализацию следующим образом:

def update_rank_sum(score)
  new_rank = self.rank_sum + score # Or substitute whatever logic is necessary here.
  self.rank_sum = new_rank
end

Но помните, что вам нужно будет вызвать save в экземпляре Video, чтобы сохранить измененияв базу данных.

Обновление одного поля в одной строке может занять вашу базу данных в порядке миллисекунд, поэтому я не буду слишком беспокоиться о производительности, если вы не знаете, что вам понадобится обрабатывать 10 или 100 с.изменений в секунду.

0 голосов
/ 19 марта 2011

Я могу придумать два варианта:

  1. Обновление при новом голосовании. Что, вероятно, нормально, так как вы можете иметь индекс в этом поле.
  2. Обновление cron каждые 1 час или около того.
0 голосов
/ 19 марта 2011

Ответ на вопрос «когда / как часто» обновлять будет больше зависеть от содержания метода rank_sum. Предполагая, что этот метод возвращает одно и то же значение, если что-то в объекте Video не изменяется, и не имеет внешних зависимостей, тогда было бы неплохо добавить обратный вызов before_save. Однако, если метод rank_sum имеет внешние зависимости, такие как, возможно, чтение из таблицы рейтингов, то это будет скорее «бизнес-решение» относительно того, как часто вы хотите обновить это значение в базе данных, возможно, больше или реже, чем обратный вызов before_save вызовет его.

UPDATE

Пример:

before_save :set_rank_sum

private

  def set_rank_sum
     self.rank_sum = rank_sum(value1, value2)
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...