使用SQL和Rails查找相关表的巧合,并知道巧合的位置

时间:2016-10-06 19:46:30

标签: sql ruby-on-rails ruby postgresql

好吧,我有下一个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

1 个答案:

答案 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.