我过去曾问过类似的事情,但我想我可能错误地提出了这个问题。
我想知道rails是否可以通过对象的show动作获取当前属性,然后对该属性执行搜索功能。例如
def show
@recipe = Recipe.find(params[:id])
end
在配方模型中有一个属性
:dish_name
这取决于我正在查看的食谱,所以说我想列出与显示页面上显示的当前dish_name相似的食谱,我将如何进行此操作?只是寻找正确方向的一些指针。我已经看过solr但是我已经决定坚持使用搜索功能来搜索我的搜索功能,虽然我无法在搜索中找到实现这一目标的方法..有没有人在此之前编写过这样的方法?
BBC食物会做类似的事情,如果不是我想要达到的目的http://www.bbc.co.uk/food/recipes/easy_chocolate_cake_31070
如果你向右看,你会看到一个名为Related Recipes的部分
任何帮助表示赞赏
答案 0 :(得分:1)
我认为你真的不需要搜索,你可以使用ActiveRecord
's query methods。我建议在related_recipes
上创建一个实例方法Recipe
来获取相关的食谱,如下所示:
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
来显示结果。我已经对上述内容进行了大量评论,但如果有任何意义不合理,请在评论中告诉我。