1

我过去曾问过类似的问题,但我认为我的问题措辞可能不正确。

我想知道是否可以在rails中通过对象的显示操作获取当前属性,然后针对该属性执行搜索功能。例如

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

在配方模型中有一个属性

:dish_name

这取决于我正在查看的食谱,所以假设我想列出与显示页面上显示的当前菜名相似的食谱,我该怎么做?只是在正确的方向上寻找一些指示。我看过 solr,但决定坚持使用 ransack 来实现我的搜索功能,尽管我看不到在 ransack 中实现这一目标的方法。以前有没有人为这样的东西写过方法?

BBC 的食物做了类似的事情,如果不一样的话

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

如果您查看右侧,您将看到一个名为“相关食谱”的部分

任何帮助表示赞赏

4

1 回答 1

1

我不认为你真的需要为此洗劫,你可以使用ActiveRecord's query methods。我建议创建一个获取相关食谱的实例方法,如下所示related_recipesRecipe

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。我已经对上述内容进行了大量评论,但如果有任何不妥之处,请在评论中告诉我。

于 2012-12-06T09:01:52.420 回答