Uso de índices Delta para asociaciones en Thinking Sphinx
Tengo un modelo de producto:
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
Ahora, suponga que un usuario actualiza un nombre de subcategoría, ¿cuál es la forma correcta de actualizar el índice delta de productos?
De acuerdo con esta documentación:http://freelancing-god.github.com/ts/en/deltas.html, unasalvar el mensaje debe enviarse al producto, por lo que en este caso debería elegir cada producto relacionado con la subcategoría y enviar elsalvar mensaje, algo como esto:
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
Creo que esto es exagerado porque tenemos unos 100.000 productos por subcategoría. ¿Es esta la forma correcta de actualizar el índice delta? ¿Me estoy perdiendo de algo?
Después de agregar esto:
def set_product_delta_flag
Product.update_all ['delta = ?', true], ['subcategory_id = ?', id]
Product.index_delta
end
Siempre recibo este error:
NoMethodError (método indefinido `index_delta 'para #):
Entonces, la solución a este problema fue enviar el mensaje * define_indexes * al modelo del Producto.
Después de solucionar este problema, todo estaba bien, pero el delta_index no se actualizó correctamente, tenía que hacerlosalvar dos veces al modelo de subcategoría.
Entonces mi solución final es esta:
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
Utilizandoafter_commit ydefine_indexes Cuál es la solución correcta? Es el único que he encontrado.