我有一个具有搜索表单的材料模型。搜索操作看起来有点像这样:
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
答案 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)
试一试。