好吧,我有下一个Rails范围,当给出一个词时,我发现在名称,描述,城市或与公司相关的任何产品中匹配该词的公司。
includes([:products, {city: :department}]).where("unaccent(LOWER(companies.name))
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%')
OR unaccent(LOWER(companies.description))
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%')
OR unaccent(LOWER(cities.name))
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%')
OR unaccent(LOWER(products.name))
ILIKE('%#{term.parameterize.underscore.humanize.downcase}%')"
.gsub("ñ","n")).references(:products, :city, :department)
这很好用,但我知道我需要知道哪些(名称,描述,城市或产品)是巧合。
我在下一个解决方案中已经考虑过,但我不确定它是否有效或足够好。
解决方案即可。 在4个不同的查询中分离范围,然后使用循环和辅助列填充类似"符合条件,名称和描述"在每个不同的查询。 然后使用这样的东西
query1 | query2 | query3 | query4 # to merge the arrays
对于记录我的Rails应用程序正在使用Postgres 9.4
答案 0 :(得分:1)
我认为通过将结果分成四个查询,您有一个良好的开端。
合并它们时,您希望保留一种方法来查看它来自哪个查询。
如果你的结果是哈希值很好,你可以这样做:
results = []
results.concat query1.map { |record| record.attributes.merge(query: "query1") }
results.concat query2.map { |record| record.attributes.merge(query: "query2") }
# etc
如果希望结果是活动记录对象,可以添加虚拟属性并执行类似的操作
# in the model, add a virtual attribute (not stored in db)
attr_accessor :query
# in the controller
records = []
records.concat query1.map { |record| record.query = "query1"; record}
records.concat query2.map { |record| record.query = "query2"; record}
# etc.