【问题标题】:Rails 4 - Thinking Sphinx filter using field on related modelRails 4 - 使用相关模型上的字段思考 Sphinx 过滤器
【发布时间】:2015-03-31 15:56:25
【问题描述】:

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

'代理组'

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中如何使用模型之间的关系?

【问题讨论】:

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


    【解决方案1】:

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

    第 1 步:将 AgencyGroup ID 作为属性添加到您的广告索引中。如果您使用的是 SQL 支持的索引 (:with => :active_record),那么它是单行的:

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

    如果您使用的是实时索引,那么您需要在 Advertisement 中使用一个方法来返回所有这些 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}
    

    【讨论】:

    • 太棒了!完美运行。非常感谢您的回答。清洁和简单的解决方案。完美。
    猜你喜欢
    • 2011-06-11
    • 2017-11-17
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多