: counter_cache для всего - PullRequest
       2

: counter_cache для всего

3 голосов
/ 17 марта 2011

У меня есть простой набор из двух связанных таблиц «порядка», который имеет много «line_items». Также есть количество, связанное с позицией, например,

Заказ1
line_item a: «плетение корзин для начинающих», количество: 3
line_item b: «Справочник чайников по вампиризму», количество: 1

Когда я устанавливаю миграцию, я могу включить количество, используя:

Order.find(:all).each do |o|
  o.update_attribute :line_items_count, o.line_items.map(&:quantity).sum
end

, что дает мне правильное количество элементов (4), но я не могу сделать это в модели заказа, потому что не могу передать количество позиций, и поэтому он просто считает количество позиций (2).

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

belongs_to :order, :counter_cache => true

Можно ли как-то указать количество, чтобы оно правильно указывало 4 вместо 2?

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Функция counter_cache предназначена для поддержания количества (а не суммы) зависимых элементов.

Этого легко добиться, написав несколько строк кода ruby.

Предположим, что в вашей таблице orders есть столбец с именем line_items_sum. Значение этого столбца по умолчанию должно быть 0.

class AddLineItemsSumToOrder < ActiveRecord::Migration
  def self.up
    add_column :orders, :line_items_sum, :integer, :default => 0
  end

  def self.down
    remove_column :orders, :line_items_sum
  end
end


class Order < ActiveRecord::Base
  has_many :line_items
end

Теперь добавьте обратный вызов в класс LineItem.

class LineItem < ActiveRecord::Base
  validates_numericality_of :quantity
  belongs_to :order
  after_save :update_line_items_sum

private
  def update_line_items_sum
    return true unless quantity_changed?
    Order.update_counters order.id, 
      :line_items_sum => (quantity - (quantity_was || 0))
    return true
  end
end
1 голос
/ 17 марта 2011

Я думаю, что вам лучше всего написать собственный метод для кэширования общего количества. Если вы не следуете «путям Rails» для хранения счетчика, вам лучше написать свой собственный.

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