Rails 4 - Thinking Sphinx 过滤器在相关模型上使用字段
Rails 4 - Thinking Sphinx filter using field on related model
在我的 Rails 4 应用程序中,我有如下模型:
'AgencyGroup'
has_many :group_agencies
has_many :agencies, :through => :group_agencies
我保留 'token' 字段的地方
'Agency' 型号
has_many :group_agencies
has_many :agency_groups, :through => :group_agencies
has_many :advertisements
'Advertisement' 型号
belongs_to :agency
我使用 Thinking Sphinx,它的效果非常好,但现在我有了新的要求,需要按 AgencyGroup 令牌字段过滤 'Advertisements'。
基本上我需要找到带有一些参数的广告,但仅限于在具有已发布令牌的代理组中的代理。
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 步:将 AgencyGroup ID 添加为广告索引中的属性。如果您使用的是 SQL 支持的索引 (:with => :active_record
),它是单行的:
has agency.group_agencies.agency_group.id, :as => :agency_group_ids
如果您使用的是实时索引,那么您需要在 Advertisement 中使用一种方法,returns 所有这些 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}
在我的 Rails 4 应用程序中,我有如下模型:
'AgencyGroup'
has_many :group_agencies
has_many :agencies, :through => :group_agencies
我保留 'token' 字段的地方
'Agency' 型号
has_many :group_agencies
has_many :agency_groups, :through => :group_agencies
has_many :advertisements
'Advertisement' 型号
belongs_to :agency
我使用 Thinking Sphinx,它的效果非常好,但现在我有了新的要求,需要按 AgencyGroup 令牌字段过滤 'Advertisements'。
基本上我需要找到带有一些参数的广告,但仅限于在具有已发布令牌的代理组中的代理。
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 步:将 AgencyGroup ID 添加为广告索引中的属性。如果您使用的是 SQL 支持的索引 (:with => :active_record
),它是单行的:
has agency.group_agencies.agency_group.id, :as => :agency_group_ids
如果您使用的是实时索引,那么您需要在 Advertisement 中使用一种方法,returns 所有这些 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}