Я думаю, что в этом случае вам следует определить ассоциации для вашей Employee
модели (которую вы, вероятно, уже имели), например:
class Employee < ActiveRecord::Base
...
belongs_to :company
has_one :municipality, :through => :company
has_one :county, :through => :company
...
end
class Company < ActiveRecord::Base
...
belongs_to :municipality
has_many :employees
has_one :county, :through => :municipality
...
end
class Municipality < ActiveRecord::Base
...
belongs_to :county
has_many :companies
...
end
class County < ActiveRecord::Base
...
has_many :municipalities
...
end
Редактировать: Я проверялмногоуровневые отношения has_one
, и это не работает так.Кажется довольно сложным моделировать эти 4 слоя без денормализации.Я обновлю, если что-нибудь придумаю.В любом случае, если вы денормализуете (то есть добавляете избыточные внешние идентификаторы для всех моделей в таблицу своих сотрудников), ассоциации будут простыми, и вы значительно увеличите время создания индекса.В то же время может потребоваться больше усилий для обеспечения согласованности.
После того, как ассоциации установлены, вы можете определить индекс Сфинкса в вашей модели Employee
, например:
define_index do
indexes :name, :sortable => :true
indexes company(:name), :as => :company
indexes municipality(:name), :as => :municipality
indexes county(:name), :as => :county
...
end
Таким образом, столбцы в ваших ассоциациях также индексируются, и Sphinx автоматически объединяет все эти таблицы вместе при построении индекса.