Решение, как и Маурисио Линьярес в своем комментарии, состоит в том, чтобы просмотреть модель и группу актеров по фильмам.
Проблема в том, что Sunspot не поддерживает Solr 3.3 или 4.0, которые являются единственными версиями Solr, поддерживающими группировку.
Вот мое решение с использованием Sunspot 1.2.1 и Solr 3.3.
В моем примере movie_id
помещен в таблицу актеров, в моем реальном приложении этого не делается.
# == Schema Information
#
# Table name: actors
#
# id :integer(4) not null, primary key
# name :string(255)
# created_at :datetime
# updated_at :datetime
# movie_id :integer(4)
#
class Actor < ActiveRecord::Base
searchable do
# We need to store the movie_id as an string
# So it can be sorted. We also need to pass the
# stored: true params
string :movie_id, stored: true do
movie_id.to_s
end
end
def search_using_solr
scoped = Sunspot.new_search(Actor)
scoped.build do
adjust_solr_params do |params|
params[:group] = true
params[:"group.field"] = "movie_id_s"
params[:"group.format"] = "simple"
end
end
# Sunspot 1.2.1 doesn't support grouping, so we need to do some hacking.
def scoped.hits
@hits ||= @solr_result["grouped"].values.first["doclist"]["docs"].map do |doc|
Sunspot::Search::Hit.new(doc, nil, self)
end
end
def scoped.total
@total ||= @solr_result["grouped"]["movie_id_s"]["matches"] || 0
end
# Here we'll only fetch the stored data from Solr it self,
# and then pass it manualy to ActiveRecord.
Movie.where({
id: scoped.execute.hits.map{ |h| h.stored(:movie_id) }
})
end
end
Cred to alindeman за его пример суть .