2014-11-06 103 views
0

我試圖用自定義sql條件縮小獅身人面像搜索結果時遇到了麻煩。經過兩天的嘗試和沮喪,我甚至不在乎如何去做:在搜索之前(通過自定義索引條件),搜索內部或搜索之後。思維獅身人面像 - 用sql搜索範圍很窄

我有兩個類:主題和成績,以及它們之間的連接表。

class Theme < ActiveRecord::Base 
    has_many :grades, through: :theme_grades 
end 

class Grade < ActiveRecord::Base 
    has_many :themes, through: :theme_grades 
end 

我要過濾獅身人面像搜索主題與具有特殊grade_id或沒有grade_ids可言。

在ActiveRecord的它應該是這樣的:

Theme.joins(:theme_grades). 
     where('theme_grades.grade_id = ? OR theme_grades.grade_id IS NULL', %ID%) 

在SQL這將是這樣的:

SELECT "themes".* FROM "themes" 
INNER JOIN "theme_grades" ON "theme_grades"."theme_id" = "themes"."id" 
WHERE (theme_grades.grade_id = %ID% OR theme_grades.grade_id IS NULL) 

但我不知道如何與搜索結果中使用它。

我想:

  1. SQL:{加入: '...'}在搜索選項哈希,重寫我的 'WHERE' 作爲連接條件。它不起作用,導致像「獅身人面像找到ID,但ActiveRecord找不到它們」這樣的錯誤,因爲AR在我們縮小的搜索中查找它們並期望找到它們。

  2. 搜索後,只需將找到的對象的id(因爲搜索後我們接收數組,而不是關係),並通過AR找到它們,我們之間的關係是什麼。我們可以使用關係 - 只需添加其他範圍。問題在於節選 - 我需要它們,但我不明白如何處理它們以適應我的關係。

  3. 我的最後一個想法是爲我的每一個年級(我有6個不同的年級)做出6個不同的指數。並以某種方式劃分它們之間的主題,但要記住沒有等級的主題應該在每個索引中。

+0

獅身人面像和SQL是兩個不同的世界。在Rails中,兩者都創建類似哈希數組的結果,但它們並不真正可以聯接。如果您的Sphinx索引也是grade_id,那麼您可以在Sphinx查詢中將其用作過濾器。 – 2014-11-07 03:27:00

+0

@湯姆,你是對的。我被這個頁面底部描述的'sql'選項欺騙了http://pat.github.io/thinking-sphinx/searching.html - 它看起來就像自定義的sql。對grade_id進行索引是一個好主意。但主題有許多grade_ids,所以我沒有看到任何解決方案來比較主題索引中的grade_ids數組: '具有theme.grade_ids,如::grade_ids' 帶有一個grade_id,通過''with'=> {}'正在搜索。 – 2014-11-07 12:08:04

回答

0

結果最好是有這種過濾發生在獅身人面像,因爲那時分頁是可靠的(它只是有點整潔做這一切在一次)。

所以,你需要兩個屬性在你的主題指數 - 一個用於所有等級的ID(整數數組),以及一個指示是否有任何級別的IDS(一個布爾值):

# if your index is SQL-backed (with: :active_record) 
has theme_grades.grade.id, as: :grade_ids 
has "COUNT(DISTINCT theme_grades.id) > 0", as: :any_grade_ids, type: :boolean 

# or if you're using real-time indices: 
has grade_ids, type: :integer, multi: true 
has grade_ids.any?, as: :any_grade_ids, type: :boolean 

然後搜索應該是這樣的 - 構建基於等級ID和過濾器通過屬性的動態屬性:

@themes = Theme.search select: "*, (IN(grade_ids, #{grade_id}) OR NOT any_grade_ids) AS grade_match", 
    with: {grade_match: true} 
+0

不可思議!這是我一直在尋找的方法!我將嘗試它並報告它是如何工作的。 – 2014-11-09 18:10:17

+0

只需複製/粘貼後即可正常工作!你真的是thinking_sphinx的專家!謝謝你的確切答案! – 2014-11-13 17:20:07

+0

嗯,我確實寫過思維獅身人面像,所以幫助;) – pat 2014-11-13 21:37:39

0

在給出的情況下,您可以修改ThinkingSphinx :: Search對象本身。

@themes.map do |theme| 
    theme if theme.grade_ids.include?(grade_id) || theme.grade_ids.empty? 
end.compact 

凡@themes是ThinkingSphinx.full_text.search

+0

它的工作原理!謝謝你,我無法想象,修改搜索結果就像數組一樣簡單!就<100結果而言,它不是那麼慢的選擇。 – 2014-11-07 16:36:32

相關問題