【问题标题】:Use a postgres computed value without a column as a Ruby variable使用没有列的 postgres 计算值作为 Ruby 变量
【发布时间】:2020-10-01 21:28:54
【问题描述】:

我有一个 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 不再将计算值作为段记录的一部分返回。为什么会发生这种变化?

输出可见here

编辑结束

问候,塞巴斯蒂安

【问题讨论】:

    标签: ruby postgresql hanami hanami-model rom-rb


    【解决方案1】:

    至少在 ROM 中你可以附加函数调用,比如

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

    生成的结构应该有 similarity 属性和你需要的值。

    【讨论】:

    • 效果很好。我只需要删除到特定实体的映射。
    • 这是预期的行为吗?
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多