1

我有一个 Hanami Web 应用程序,其中一个功能是将数据库中的字符串与用户提供的字符串进行比较。为此,我使用了 postgres 扩展 pg_trgm。Ruby 中翻译后的查询条件如下所示:

.where {similarity(:content, source_text_for_lookup) > sim_score_limit}

我需要解决的问题是将计算出的相似度分数返回给 Ruby 并将其呈现给用户。然而,相似度分数不是一个属性,因为它仅在 PG 中调用该函数以比较两个字符串时才相关或应该存在。

有没有办法做到这一点?


编辑 2021

我已经对 Segment repo 中的实现进行了更改:

def find_by_segment_match(source_text_for_lookup, source_lang, sim_score)
  aggregate(:translation_records)
    .where(language_id: source_lang)
    .where { similarity(:content, source_text_for_lookup) > sim_score/100.00 }
    .select_append { float::similarity(:content, source_text_for_lookup).as(:similarity) }
    .order { similarity(:content, source_text_for_lookup).desc }
end

对此

def find_by_segment_match1(source_text_for_lookup, source_lang, sim_score)
  segments
    .where(language_id: source_lang)
    .where { similarity(:content, source_text_for_lookup) > sim_score/100.00 }
    .select_append { float::similarity(:content, source_text_for_lookup).as(:similarity) }
    .order { similarity(:content, source_text_for_lookup).desc }
end

所以我已经删除了聚合,只是现在,select_append 不再返回计算值作为段记录的一部分。为什么会发生这种变化?

输出可以在这里看到。

编辑结束

问候,塞巴斯蒂安

4

1 回答 1

3

至少在ROM中你可以附加函数调用,smth like

.select_append { float::similarity(:content, source_text_for_lookup).as(:similarity) }

生成的结构应该具有similarity您需要的值的属性。

于 2020-06-13T09:48:37.233 回答