思考狮身人面像有很多通过 Rails

Thinking Sphinx Has Many Through Rails

你能帮我想想狮身人面像吗?

关系:

大陆 has_many :国家 has_many :country_reports, 通过: :countries, :class_name => "Report" has_many:出版商,通过::country_reports

预期输出:

我要找Continent.first.publishers

请告诉我thinking sphinx这个怎么写rails

正如我在 Thinking Sphinx Google 群组中的回答:

因为您是在发布商上搜索,所以您需要修改发布商索引才能使其正常工作。我假设出版商 belongs_to :country_report、国家报告 belongs_to :国家和国家 belongs_to :continent.

如果您使用 SQL 支持的索引(使用 :with => :active_record 选项),那么您需要在发布商索引中包含以下内容:

has country_report.country.continent_id, :as => :continent_id

如果你使用的是实时索引(:with => :real_time),也是一样的,但你必须指定类型:

has country_report.country.continent_id, :as => :continent_id, :type => :integer

但是,如果在从出版商到大陆的关联链中有 has_many 或 has_and_belongs_to_many 而不是 belongs_to,那么它会稍微复杂一些。此外,在这种情况下,发布商可能有多个大陆,因此我们在这里处理多个值。

对于 SQL 支持的索引,一个小改动,改变关联链:

has country_reports.country.continent_id, :as => :continent_ids

但是对于实时索引,最好在 Publisher 模型上有一个方法 returns 一个或多个必要的值,然后在索引中使用它:

# in app/models/publisher.rb
def continent_ids
  country_reports.collect(&:country).collect(&:continent_id)
end

# in app/indices/publisher_index.rb
has continent_ids, :type => :integer, :multi => true

然后,重建索引后,您可以按如下方式搜索(如果合适,属性可以是复数):

Publisher.search “foo”, :with => {:continent_id => continent.id}

这个也可以工作(虽然多层次的关联可能会混淆):

continent.publishers.search “foo”