你能帮助我思考狮身人面像吗?
关系:
洲 has_many:国家 has_many:country_reports,::: countries,:class_name => "报告" has_many:publishers,通过:: country_reports
预期产出:
我想找到Continent.first.publishers
请告诉我如何在思考sphinx rails中写这个
答案 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”