Rails 4 - 思考Sphinx过滤器使用相关模型上的字段

时间:2015-03-31 15:56:25

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

在我的Rails 4应用程序中,我有以下模型:

' AgencyGroup'

has_many :group_agencies
has_many :agencies, :through => :group_agencies

我保留的地方'令牌'字段

'机构'模型

  has_many :group_agencies
  has_many :agency_groups, :through => :group_agencies
  has_many :advertisements

'广告'模型

  belongs_to :agency

我使用Thinking Sphinx并且它确实很有效但现在我有了新的要求来过滤'广告'通过AgencyGroup令牌字段。

基本上我需要查找带有一些参数的广告,但仅限于代理商组中包含已发布令牌的代理商。

if params[:search]
 @results = Advertisement.search Riddle::Query.escape(params[:search]), :star => true, :page => params[:page], :per_page => 6
end

为了获得结果,我运行http查询,如下所示:

http://api.localhost.local:3000/v1/advertisements?token=JHW_tdXn5g-vQY1f_ZzLuw&search=Nissim

我失踪了什么?如何在TS中使用模型之间的关系?

1 个答案:

答案 0 :(得分:0)

我认为这里最好的方法包括几个步骤:

第1步:在广告索引中添加代理商组ID作为属性。如果你正在使用SQL支持的索引(:with => :active_record),它就是一个单行:

has agency.group_agencies.agency_group.id, :as => :agency_group_ids

如果你正在使用实时索引,那么你想要一个广告中的方法返回所有这些ID:

def agency_group_ids
  agency.agency_group_ids
end

您的属性定义将如下所示:

has agency_group_ids, :type => :integer, :multi => true

第2步:因为您已经更改了索引结构,所以不要忘记重建索引:

# for SQL-backed indices:
rake ts:rebuild
# or, for real-time indices
rake ts:regenerate

第3步:在您的控制器中,找到给定令牌的代理商组:

agency_group = AgencyGroup.find_by :token => params[:token]

第4步:最后,在搜索电话中使用该代理机构的ID:

@results = Advertisement.search Riddle::Query.escape(params[:search]),
  :star     => true,
  :page     => params[:page],
  :per_page => 6,
  :with     => {:agency_group_ids => agency_group.id}