Обновление родительской модели при дочернем обновлении - PullRequest
0 голосов
/ 23 июня 2009

У меня есть две модели, сгенерированные скаффолдами: Book и Bookbag. У Bookbag есть много Книг, а Книга принадлежит Bookbag. У каждой Книги есть вес, и у каждого Книжного пакета есть средний вес, который должен хранить средний вес всех его Книг. Каков наилучший способ поддерживать средний вес в курсе?

Использование фильтра «до сохранения» в Bookbag не работает, поскольку он вызывается не при каждом обновлении книги, которую он содержит, и я не хочу обновлять средний вес при каждом обновлении книги, только при изменении веса книги .

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

Быстрое решение может быть что-то вроде этого:

class Book
  def before_save
    self.bookbag.update_avg if self.weight_changed?
  end
end
0 голосов
/ 23 июня 2009

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

class Bookbag < ActiveRecord::Base
  has_many :books

  def weight_average
    self.books.average(:weight)
  end
end

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

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