2012-02-12 90 views
4

我建立一個應用程序,我想通過對象的標題用一個簡單的搜索搜索和標籤(使用acts_as_taggable_on)在一個搜索簡單搜索,acts_as_taggable

我能去建造一個,但不是兩個,並且在我的智慧結束試圖弄清楚。

要搜索使用標籤,我用:

@post = Post.tagged_with(params[:search]) 

要搜索的對象,我用:

@post = Post.search(params[:search]) 

而且我寫了一個名爲Post模型的搜索方法,如下所示:

def self.search(search) 
    if search 
    where('question LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

任何想法如何結合這兩個查詢?任何企圖到目前爲止已經失敗,主要是因爲沒有在我的崗位模型中的「標籤」列等

+0

我正在尋找同樣的東西,沒有運氣。你有沒有運氣呢? – 2012-02-26 22:08:59

回答

2

我想通了,在我的解決方案中進行測試,我寫了自己的連接,所以它不像我想的那麼幹淨,所以如果任何人有更好的解決方案,我仍然很喜歡看到它。這是我想出的:

q = "%#{search}%" 
     Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id") 
     .joins("LEFT JOIN tags on tags.id = taggings.tag_id") 
     .where('title LIKE ? OR tags.name LIKE ?', q, q) 

這是在我的測試中按預期工作。我正在測試三個記錄。一個在標題中有搜索詞,另一個只有標籤,第三個有標題和標籤,所以它不應該返回重複。

希望這會有所幫助。

+0

我已經更新了代碼以包含select方法,以便爲查詢添加不同的內容。我最初的測試不夠全面,而且我發現在某些情況下會返回重複的結果。在這一點上,這幾乎就像編寫原始SQL代碼一樣,但這是目前我能想到的最好的。 – 2012-02-29 13:32:54

1

我發現這一點: Search form with acts_as_taggable_on (Rails 3)

這可能工作,但我還傳呼我的結果與雷寶石,所以當我用這個方法,我得到以下錯誤:

undefined method `page' for []:Array 

所以這不會在我的情況下工作。我很想用單個查詢來解決整個問題。

+0

您可以通過兩步來完成,如[https://github.com/davidcelis/goodbre.ws/blob/master/app/controllers/dashboard_controller.rb]所示。我沒有測試它,但希望這會讓你在正確的軌道上: 啤酒= Beer.includes(:brewery,:style).top(100) 啤酒= Kaminari.paginate_array(啤酒).page(params (25) – Matt 2012-11-14 16:46:46

0

作爲Andrew代碼的後續工作,我在我的模型中使用了這種搜索方法 - 只是增加了大小寫敏感性,並使得「title」查詢更加明確一些,因爲我的模型實際上包含一個「name」曖昧。

def self.search(search) 
    if search.present? 
    q = "%#{search}%" 
    Post.select('distinct posts.*').joins("LEFT JOIN taggings on posts.id = taggings.taggable_id") 
     .joins("LEFT JOIN tags on tags.id = taggings.tag_id") 
     .where('lower(posts.title) LIKE lower(?) OR lower(tags.name) LIKE lower(?)', q, q) 
    else 
    all 
    end 
end