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

时间:2015-07-28 11:33:10

标签: thinking-sphinx ruby-on-rails-4.2

你能帮助我思考狮身人面像吗?

关系:

洲 has_many:国家 has_many:country_reports,::: countries,:class_name => "报告" has_many:publishers,通过:: country_reports

预期产出:

我想找到Continent.first.publishers

请告诉我如何在思考sphinx rails中写这个

1 个答案:

答案 0 :(得分:1)

我在Thinking Sphinx Google小组上回答:

因为您正在搜索发布商,所以您需要修改发布商索引才能使其发挥作用。我假设出版商belongs_to:country_report,country report belongs_to:country,country belongs_to:continent。

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

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模型上有一个返回必要值或值的方法,然后在索引中使用它:

# 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”