Использование дельта-индексов для ассоциаций в Thinking Sphinx - PullRequest
2 голосов
/ 04 февраля 2011

У меня есть модель продукта:

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 является правильным решением? Это единственный, который я нашел.

1 Ответ

4 голосов
/ 05 февраля 2011

Попробуйте вместо этого:

def set_product_delta_flag
  Product.update_all ['delta = ?', true], ['subcategory_id = ?', id]
  Product.index_delta
end

Один оператор SQL, одна дельта-переиндексация. Должен работать намного лучше:)

...