使用没有列的 postgres 计算值作为 Ruby 变量
Use a postgres computed value without a column as a Ruby variable
我有一个 Hanami Web 应用程序,其中一个功能是将数据库中的字符串与用户提供的字符串进行比较。为此,我使用了 postgres 扩展 pg_trgm。 Ruby 中的翻译查询条件如下所示:
.where {similarity(:content, source_text_for_lookup) > sim_score_limit}
我需要解决的问题是将计算出的相似度得分返回到Ruby并将其呈现给用户。但是,相似度分数不是属性,因为它只相关或应该只存在于 PG 中调用函数比较两个字符串时。
有办法吗?
编辑 2021
我对 Segment 仓库中的实现进行了更改:
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 不再将计算值作为段记录的一部分返回。为什么会发生这种变化?
输出可见here.
编辑结束
此致,塞巴斯蒂安
至少在 ROM 中你可以追加函数调用,像
.select_append { float::similarity(:content, source_text_for_lookup).as(:similarity) }
生成的结构应该具有包含您需要的值的 similarity
属性。
我有一个 Hanami Web 应用程序,其中一个功能是将数据库中的字符串与用户提供的字符串进行比较。为此,我使用了 postgres 扩展 pg_trgm。 Ruby 中的翻译查询条件如下所示:
.where {similarity(:content, source_text_for_lookup) > sim_score_limit}
我需要解决的问题是将计算出的相似度得分返回到Ruby并将其呈现给用户。但是,相似度分数不是属性,因为它只相关或应该只存在于 PG 中调用函数比较两个字符串时。
有办法吗?
编辑 2021
我对 Segment 仓库中的实现进行了更改:
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 不再将计算值作为段记录的一部分返回。为什么会发生这种变化?
输出可见here.
编辑结束
此致,塞巴斯蒂安
至少在 ROM 中你可以追加函数调用,像
.select_append { float::similarity(:content, source_text_for_lookup).as(:similarity) }
生成的结构应该具有包含您需要的值的 similarity
属性。