ruby on rails 3-试图访问sphinx内部数据



我有一个国家/地区表(下面列出的型号)。我添加了thinking sphinx作为搜索,并希望使用它来显示结果。

country.rb

class Country < ActiveRecord::Base
  has_many  :provinces
  has_many  :cities
  has_many  :zones
  has_many  :users
  attr_accessible :alpha_2, :alpha_3, :country_name, :numeric, :country_active
  scope :ordered, order("country_name")
  scope :active, where(:country_active => true)
end

country_index.rb

ThinkingSphinx::Index.define :country, :with => :active_record do
  indexes country_name, :sortable => true
  has created_at, updated_at
  has "(select COUNT(provinces.id) from provinces where provinces.country_id = id)", :as => :province_count, :type => :integer
end

在我看来,如果某个国家的省份数大于0,我需要添加一个与该国家的省份的有条件链接。

count = country.provinces.count
if count > 0
    link_to(country.country_name, provinces_path(:id => country.id))
else
    country.country_name
end

我试图用替换计数的活动记录查询

count = Country.search(:select => "province_count", :with => {:country_name => country.country_name})

但我还没有成功地让它发挥作用。如何才能做到这一点。我正在处理这个链接

需要注意的两件事应该有助于解决这个问题:

首先,您可以通过在索引定义中使用join方法来强制关联上的联接——这节省了对完整子查询的需求:

ThinkingSphinx::Index.define :country, :with => :active_record do
  indexes country_name, :sortable => true
  has created_at, updated_at
  has "COUNT(provinces.id)", :as => :province_count, :type => :integer
  join provinces
end

其次,更重要的是,如果您希望在使用搜索结果时访问狮身人面像属性,则需要使用Thinking Sphinx窗格:

search = Country.search(:with => {:sphinx_internal_id => country.id})
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
count = search.first.sphinx_attributes['province_count']

您会注意到,我是按主键而不是国家名称进行筛选的-id更具体,因此您最终会得到特定的匹配项,而且国家名称是一个字段,而不是属性,所以如果您想按字段进行筛选,请使用:conditions而不是:with。如果它属性,则不能按它进行筛选,因为Sphinx不支持对字符串属性进行筛选。

请注意,将这三行复制并粘贴到Rails控制台中是不起作用的,因为控制台不仅评估行,而且输出结果,并且输出搜索结果会调用对Sphinx的调用,因此窗格没有得到适当的应用。一种变通方法是在第一行的末尾包含; '',因此得到输出的结果是一个空字符串:

search = Country.search(:with => {:sphinx_internal_id => country.id}); ''
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
count = search.first.sphinx_attributes['province_count']

如果你真的在进行广泛的搜索,而不仅仅是在某个特定的国家,并且你想统计每个国家的省份,你可以停止阅读这里。删除过滤器,但一定要添加窗格,这样就可以继续了。

但是,如果你真的只是在一个国家记录上运行。。。。

你可以进一步简化事情——毕竟,你只想要计数,而不是实际的Country对象:

search = Country.search(
  :with       => {:sphinx_internal_id => country.id},
  :middleware => ThinkingSphinx::Middlewares::RAW_ONLY
)
search.first['province_count']

但是真的,如果你已经有了country对象,那么对我来说,仅仅为了获得省份数量而进行搜索就太过分了。要么直接调用country.provinces.count,要么使用ActiveRecord的counter_cache选项,然后在你的country模型上有列provinces_count-从长远来看,这无疑是最快的选项。

(对不起,这个答案比我预期的要长得多,但它涵盖了一些不同的途径。)

有关更多信息,请参阅https://stackoverflow.com/a/35787713/520567

您可以通过以下方式直接运行查询:

results = ThinkingSphinx::Connection.take do |connection|
  connection.execute "SELECT * FROM user_core, user_delta"
end

相关内容

  • 没有找到相关文章

最新更新