2012-12-06 76 views
1

我在過去曾問過類似問題,但認爲我可能錯誤地回答了問題。根據當前對象ID生成搜索結果

我想知道是否有可能在rails中通過對象的show動作獲取當前屬性,然後針對該屬性執行搜索功能。例如

def show 
@recipe = Recipe.find(params[:id]) 
end 

在配方模型有一個屬性

:dish_name 

這改變這取決於配方我在看,所以說我想列出類似於當前dish_name是食譜顯示在顯示頁面上,我將如何去解決這個問題?只是在正確的方向尋找一些指針。我曾看過solr,但決定堅持搜索功能的快速搜索功能,儘管我無法在ransack中找到實現此目的的方法。有沒有人爲此類方法編寫過類似方法?

BBC食物做同樣的事情,如果不一樣,我想實現

http://www.bbc.co.uk/food/recipes/easy_chocolate_cake_31070 

如果你看看右邊你會看到一個名爲相關食譜節

任何幫助表示讚賞

回答

1

我不認爲你真的需要這樣的快速搜索,你可以使用ActiveRecord's query methods。我建議在Recipe其獲取相關食譜創建一個實例方法related_recipes,像這樣:

class Recipe < ActiveRecord::Base 

    ... 

    def related_recipes 

    # take the recipe's dish name and split it at spaces, 
    # then wrap each item in the resulting array with '%' 
    # to create SQL query terms. 
    # e.g. "italian pasta" becomes ["%italian%", "%pasta%"] 
    terms = dish_name.split(' ').map { |t| "%#{t}%" } 

    # create a scope with all recipes except this one 
    others = self.class.where('id != ?', id) 

    # return all recipes other than this one that contain any of the terms 
    # e.g. for the dish "italian pasta", this will become: 
    # others.where('dish_name LIKE ? OR dish_name LIKE ?', '%italian%', '%pasta%') 
    return others.where(terms.map { 'dish_name LIKE ?' }.join(' OR '), *(terms)) 
    end 

然後在你的show操作,可以獲取相關的食譜是這樣的:

def show 
    @recipe = Recipe.find(params[:id]) 
    @related_recipes = @recipe.related_recipes 
end 

可以通過遍歷@related_recipes來顯示結果。我已經大量評論過上述內容,但如果沒有任何意義,請在評論中告訴我。

+0

謝謝你的回答,所以爲了理解這裏發生了什麼,terms = @ recipe.dish_name.split('')將會拆分正在顯示的dish_name,所以每次都會依賴於recipe ID ? – Richlewis

+0

我已經更新了我的答案,因爲我意識到你確實不需要爲這種類型的東西使用ransack。 –

+0

爲了回答你的問題,'split'將'dish_name'作爲你所在頁面的配方('@ recipe.dish_name'),並將它拆分爲空格,所以「italian pasta」變成數組''italian 「,」麪食「]'。然後它將每個術語都包含在'%'s中,在SQL語言中這意味着「匹配包含這個術語的任何東西」。然後,您可以將其傳遞給'where'以獲取包含任一術語的所有*其他*食譜。 –

相關問題