根据当前对象ID生成搜索结果

时间:2012-12-06 08:18:00

标签: ruby-on-rails-3 activerecord comparator

我过去曾问过类似的事情,但我想我可能错误地提出了这个问题。

我想知道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的部分

任何帮助表示赞赏

1 个答案:

答案 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来显示结果。我已经对上述内容进行了大量评论,但如果有任何意义不合理,请在评论中告诉我。