我正在实现一个可搜索的数据库,我有一个工具模型可以通过作为标记宝石的行为进行标记。它还有一个类方法,允许我搜索工具的name属性:
class Tool < ActiveRecord::Base
acts_as_ordered_taggable
def self.search(search)
if search
where('lower(name) LIKE lower(?)', "%#{search}%")
else
scoped
end
end
end
现在在我的一个页面中,我正在尝试实现一个搜索函数,如果工具的名称包含搜索的子字符串,或者工具被标记为包含搜索子字符串的标记,则返回结果。我的控制器有以下代码:
class ToolsController < ApplicationController
def index
@tools = Tool.all
if params[:search]
@tools = @tools.search(params[:search])
end
end
end
现在我知道我也可以搜索标签,并使用act-as-taggable-gem提供的帮助器返回工具:
@tools = @tools.tagged_with(params[:search], any: true, wild: true)
这将为我提供使用搜索字符串标记的工具,使用通配符搜索匹配任何单个标记。现在我想要做的是将它合并到一个ActiveRecord :: Relation中。我知道我可以调用它两次并且通过急切加载到数组中进行联合,但是,我需要它作为ActiveRecord :: Relation,因为我使用tag_cloud帮助器,它将关系作为输入。我能做到这一点有效吗?也许在SQL?我已经尝试了很多方法,似乎无法弄清楚如何连接它们以及我在StackOverflow上所做的所有搜索都谈到通过链接它们(交集)来合并两个ActiveRecord :: Relations,当我想要的是这两个数据集的联合。
感谢。
答案 0 :(得分:0)
我认为您可以尝试使用以下代码(未经过测试)。基于this answer
def index
@tools = Tool.all # I hope you use Rails 4
if params[:search]
tag_tool_ids = @tools.tagged_with(params[:search], any: true, wild: true).pluck(:id) # or pluck('tools.id')
search_tool_ids = @tools.search(params[:search]).pluck(:id) # or pluck('tools.id')
@tools = @tools.where('id IN (?) OR id IN (?)', tag_tool_ids, search_tool_ids
end
end
我希望这会调用一个查询(但相当复杂,可能没有优化)