Мышление Сфинкс опирается на ассоциации в модели. В обычных ситуациях вам нужно только поставить определение индекса ниже вашей ассоциации.
С плагином acts_as_taggable_on у вас нет связанных с тегами ассоциаций в файле модели и при написании
indexes tags.name,: as =>: tags
TS интерпретирует это как:
CAST(`announcements`.`name` AS CHAR) AS `tags`
(посмотрите на sql_query в development.sphinx.conf, в моем случае).
Я полагаю, что у вас есть имя атрибута в объявлении модели и вы не столкнетесь с ошибкой при перестроении индекса.
Но мы ожидаем:
CAST(GROUP_CONCAT(DISTINCT IFNULL(`tags`.`name`, '0') SEPARATOR ' ') AS CHAR) AS `tags`
и
LEFT OUTER JOIN `taggings` ON (`announcements`.`id` = `taggings`.`taggable_id`)
LEFT OUTER JOIN `tags` ON (`tags`.`id` = `taggings`.`tag_id`) AND taggings.taggable_type = 'Announcement'
Чтобы все заработало, просто добавьте ассоциации, связанные с тегами, в свою модель, прежде чем перестраивать индекс:
class Announcement < ActiveRecord::Base
acts_as_taggable_on :tags,:category
has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag, :class_name => "ActsAsTaggableOn::Tagging",
:conditions => "taggings.taggable_type = 'Announcement'"
#for context-dependent tags:
has_many :category_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag",
:conditions => "taggings.context = 'categories'"
В define_index Метод:
indexes category_tags(:name), :as => :tags
has category_tags(:id), :as => :tag_ids, :facet => true
В контроллере:
@announcement_facets = Announcement.facets params[:search], :with => {:tag_ids => [...]}
@announcements = @announcement_facets.for.paginate( :page => params[:page], :per_page => 10 )