У меня есть модель продукта:
class Product < ActiveRecord::Base
belongs_to :subcategory
define_index do
# fields
indexes subcategory.name, :as => :subcategory, :sortable => true, :facet => true
# attributes
has subcategory_id, created_at, updated_at
#properties
set_property :delta => true
Теперь предположим, что пользователь обновляет имя подкатегории, что является правильным способом обновления дельта-индекса продуктов?
Согласно этой документации: http://freelancing -god.github.com / ts / en / deltas.html , сохранить сообщение должно быть отправлено на продукт, поэтому в В этом случае я должен перейти к каждому продукту, связанному с подкатегорией, и отправить сообщение save , примерно так:
class Subcategory < ActiveRecord::Base
has_many :products
after_save :set_product_delta_flag
private
def set_product_delta_flag
products.each { |product|
product.delta = true
product.save
}
end
end
Я думаю, что это излишне, потому что у нас около 100 000 товаров в подкатегории
Это правильный способ обновления дельта-индекса? Я что-то упустил?
После добавления этого:
def set_product_delta_flag
Product.update_all ['delta = ?', true], ['subcategory_id = ?', id]
Product.index_delta
end
Я всегда получаю эту ошибку:
NoMethodError (неопределенный метод `index_delta 'для #):
Итак, решением этой проблемы было отправить сообщение * define_indexes * в модель продукта.
После исправления этой проблемы все было в порядке, но индекс delta_index не был корректно обновлен, мне нужно было дважды сохранить для модели подкатегории.
Итак, мое окончательное решение таково:
after_commit :set_product_delta_flag
private
def set_product_delta_flag
Product.define_indexes
Product.update_all ['delta = ?', true], ['subcategory_id = ?', id]
Product.index_delta
end
Использование after_commit и define_indexes является правильным решением? Это единственный, который я нашел.