如何使用条件使用act-as-taggable进行搜索

时间:2013-09-17 11:58:52

标签: ruby-on-rails-3 search acts-as-taggable-on

我有一个具有搜索表单的材料模型。搜索操作看起来有点像这样:

def search
  conditions = {}
  conditions[:version] = 'master'
  conditions[:status] = 'shared'
  conditions[:targ_lang] = params[:targ_lang] unless params[:targ_lang].blank?
  @results = Material.find(:all, :conditions => conditions)
end

我添加了act-as-taggable gem,它可以很好地保存标​​签,但是我在将它添加到搜索表单时遇到了麻烦。文档说明要使用标记查找材料,您可以使用此代码:

Material.tagged_with(["awesome", "cool"], :match_all => true)

但我不知道如何将这个条件添加到条件中。

更新

@results = Material.where(conditions) && Material.tagged_with(params[:tag_list])

这项工作提供了标签,但是如果标签列表为空,则它不起作用,所以我需要一个条件和上面的其他条件一样,只有当字段不为空时才需要Material.tagged_with ...部分

更新2 - 不良解决方案

这可行,但它不是很优雅吗?

if params[:tag_list].blank?
  @results = Material.where(conditions)
else 
  @results = Material.tagged_with(params[:tag_list]).where(conditions)
end

1 个答案:

答案 0 :(得分:0)

此代码不适合您?

Material.where(conditions).tagged_with(['awesome', 'cool'], :match_all => true)

或逆序:

Material.tagged_with(['awesome', 'cool'], :match_all => true).where(conditions)

<强>更新

在github上阅读act-as-taggable-one上的文档,有一个名为:any的选项。也许你可以尝试使用它。我没有一个项目我可以做一些测试,但可能是一个代码:

Material.tagged_with(['awesome', 'cool', '', nil], :any => true).where(conditions)

试一试。