显示与显示页面上显示的另一个对象相似的对象

时间:2012-12-03 19:36:06

标签: ruby-on-rails-3 methods scopes

希望标题有一些意义,但我会详细介绍。我有一个简单的应用程序,允许用户上传食谱。然后,您可以通过show action

单独查看它们或单独查看每个配方
def show
@recipe = Recipe.find(params[:id])
end

在视图中,我会显示该配方的各种属性,如此

  <b><%= @recipe.dish_name %></b><br>
  <b><%= image_tag @recipe.avatar.url(:showrecipe) %><b><br>
  <b>by&nbsp;<%= @recipe.user.name %></b></br></br>
  <b>Description</b></br>
  <b><%= @recipe.description %></b></br>
  <b>Ingredients</b></br>
  <b><%= raw(ingredient_names_list(@recipe.ingredients)) %></b>
  <br>
  <b>Preperation Steps</b></br>
  <ol>
  <li><%= raw(preperation_steps_list(@recipe.preperations)) %></li>
  </ol>

我想要实现的是在同一页面上有一个部分,它将列出与所显示的配方相似的其他配方的名称,基于dish_name

这是我第一次做这样的事情,所以我正在寻找一些关于要查看哪些资源或如何进行此事的指示

到目前为止,我的想法是

1)创建一个方法,根据正在显示的dish_name调用范围,传递dish_name的参数。

这可能是错的,只是想朝正确的方向寻求推动

修改

我也在我的节目动作中尝试了这个但是我得到错误的参数数量(1代表0)

@relatedrecipe = Recipe.where(@recipe.dish_name('LIKE'),(params[:dish_name]))

由于

1 个答案:

答案 0 :(得分:2)

如果我这样做,我会将我的应用程序插入一个全文搜索数据库,例如sunspot_solrsunspot_rails,并索引标题,描述和成分列表。

然后使用标准化版本的标题和成分创建一个通用搜索,排除您正在查看的记录,以提出近乎命中和相关内容。

修改以获取使用sunspot_rails的更具体的示例(我有一些经验):

sunspot_rails在模型中使用可搜索的块来告诉它应该在create / update / destroy上索引什么。 您可以创建自定义索引,如下面显示的:ingredient_names。

class Recipe < ActiveRecord::Base

  searchable do
    integer :id
    string  :description
    text    :preparations
    text    :ingredient_names
  end

  def ingredient_names
    ingredients.map{|i| i.name }.uniq.compact.join(' ')
  end

  def similar_recipes
    search = Recipe.search do
      without(:id, self.id) # don't return the same record
      fulltext(self.description) do
        boost_fields(:description => 2) # give extra weight to description matches
      end
      fulltext(self.ingredient_names)
    end
    search.results
  end

end