Динамические поля с Thinking Sphinx

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

Мой вопрос:

Может ли Thinking Sphinx фильтровать продукты по свойству и значению свойства, например:

:with => {:property_id => property_value}

Если это возможно, то как лучше всего это реализовать? Если нет, есть ли другая библиотека для решения этой проблемы?

Спасибо

/ Ола


person Ola Karlsson    schedule 21.04.2010    source источник


Ответы (3)


Один из подходов состоит в том, чтобы сохранить свойство property_id как многозначный атрибут.

class Product < ActivRecord::Base
  has_one :category
  has_many :properties, :through => :category

  KVP = "###"
  define_index do
    has properties("CONCAT(`properties`.`key`, \"%s\", `properties`.`value`)" %
           KVP, :as => :category_key_value
  end

  def search_with_properties keys, with_attr={}, p={}
    wp = (with_attr||{}).dup
    values = p.map{|k, v| "#{k}#{KVP}#{v}"} unless p.empty?
    wp = wp.merge({:category_key_value => values}) unless values.empty?
    search keys, :with => wp
  end
end

class Category < ActivRecord::Base
  belongs_to :product
  has_many :properties
end

class Property < ActivRecord::Base
  belongs_to :Category
  #key    E.g: region
  #value  E.g: South West
end

Теперь вы можете выполнять следующие команды поиска:

Product.search_with_properties("XYZ", nil, :region => "South West")
person Harish Shetty    schedule 21.04.2010
comment
Кажется, у меня нет доступа к методу category_key_values ​​при индексировании Thinking Sphinx. Неизвестный столбец ads.category_key_values ​​в списке полей - person Ola Karlsson; 22.04.2010
comment
Обновил мой ответ, посмотрите. - person Harish Shetty; 03.05.2010

Попробуй это:

Добавьте в define_index следующее:

has properties(:id), :as => :property_ids

Затем вы можете использовать :with/:without как:

:with => {:property_ids => property_value}
person Tony Fontenot    schedule 21.04.2010
comment
Это немного сложнее, чем это. Мне нужно отфильтровать значение свойства, а не идентификатор свойства. - person Ola Karlsson; 22.04.2010

Отвечает ли это на ваш вопрос:

https://github.com/freelancing-god/thinking-sphinx/issues/356

person DucDigital    schedule 07.05.2012