Отслеживание суммы некоторых полей в ассоциации - "sum_cache" - PullRequest
9 голосов
/ 08 августа 2011

У меня есть таблицы 'orders' и 'items' с ассоциацией has_many в модели.

class Order < ActiveRecord::Base
has_many :items

class Item < ActiveRecord::Base
belongs_to :order

Элемент состоит из поля количества, а Order состоит из поля amount_sum для отслеживания суммы связанныхколичество элементов.

Например:

Order 1 : name='Toms shopping cart', quantity_sum=12
Item 1 : name='T-shirt', quantity=10
Itme 2 : name='Shoes',   quantity=2

Я искал способ, чтобы при добавлении / редактировании / удалении нового элемента поле «количество_суммы» автоматически обновлялось.,В настоящее время я использую метод after_save в Item, чтобы обновить поле Order.Smount_sum.

Есть ли какой-нибудь другой аккуратный способ сделать это, кроме 'after_save' ???

Похож наcounter_cache "для отслеживания количества ассоциаций, есть ли в rails поддержка автоматического отслеживания суммы некоторых полей в ассоциации?

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Удалите поле количеств_суммы из таблицы и добавьте метод количеств_сум к классу заказа, который суммирует количество_значений

class Order < ActiveRecord::Base
  has_many :items

  def quantity_sum
    self.items.sum(:quantity)
  end
end

Должен сделать свое дело. Все, что вам нужно сделать, это удалить любой код, который у вас есть, который обновляет поле amount_sum. Вы обнаружите, что, поскольку имя метода совпадает с именем поля (которое вы не должны забыть удалить), вам не придется реорганизовывать любой код, который его использует.

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

Не забудьте удалить это поле количества_суммы из таблицы заказов

0 голосов
/ 09 февраля 2016

Я думаю, что этот камень - это то, что вы ищете.
Посмотрите в разделе "Итоги вместо подсчета" в документации.
Это должно позволить вам что-то вроде этого:

class Item < ActiveRecord::Base
  belongs_to :order
  counter_culture :order, :column_name => 'quantity_sum', :delta_column => 'quantity'
end

class Order < ActiveRecord::Base
  has_many :items
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...