0

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

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

我已经添加了作为可标记的 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
4

1 回答 1

0

这段代码对你不起作用?

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

或者相反的顺序:

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

更新

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

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

试试看。

于 2013-09-17T12:04:37.510 回答