簡體   English   中英

ThinkingSphinx-搜索has_many關聯

[英]ThinkingSphinx - Search through has_many association

我在兩個模型( IdeaIteration之間有關系。 每個想法可以有很多迭代。 模型看起來像這樣;

# idea.rb
has_many :iterations, dependent: :destroy

# I also use with: :real_time 
after_save ThinkingSphinx::RealTime.callback_for(:idea)

# iteration.rb
belongs_to :idea
after_save ThinkingSphinx::RealTime.callback_for(:idea, [:idea])

我的Idea索引如下所示:

ThinkingSphinx::Index.define :idea, :with => :real_time do
  [...]
  indexes iterations.title, as: :iteration_titles
  indexes iterations.description, as: :iteration_descriptions
  has iterations.id, :as => :iteration_ids, type: :integer
  [...]
end

我這樣搜索:

@ideas = @user.ideas.search  ThinkingSphinx::Query.escape(params[:search]),
  :with => {:team_id => @teams.collect(&:id)},
  :page     => params[:page],
  :per_page => 10,
  :order    => 'created_at DESC'

當前,搜索Iteration標題或描述將返回0個匹配。 我執行了:

rake ts:rebuild
rake ts:regenerate
rake ts:index

我錯過了什么嗎?

實時索引和SQL支持的索引之間的區別之一是,對於SQL支持的索引,您引用索引定義中的關聯和列,而對於實時索引,則引用方法。

盡管iterations是一個idea的實例方法,但是titledescriptionid並不是iterations返回的對象的方法。

解決此問題的最簡單方法包括兩部分。 首先,將實例方法添加到Idea中,以返回與迭代相關的字段和屬性所需的數據:

def iteration_titles
  iterations.collect(&:title).join(' ')
end

def iteration_descriptions
  iterations.collect(&:description).join(' ')
end

def iteration_ids
  iterations.collect &:id
end

然后在索引定義中使用這些方法:

indexes iteration_titles, iteration_descriptions
has iteration_ids, :type => :integer, :multi => true

然后,運行rake ts:regenerate進行設置( ts:rebuildts:index對實時ts:index沒有意義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM