【问题标题】:Rails 5, Postgres, ActiveRecord - how to include function value as model fieldRails 5、Postgres、ActiveRecord - 如何将函数值包含为模型字段
【发布时间】:2018-09-02 22:49:17
【问题描述】:

我在 Rails 5 应用程序中为 Postgres 使用 Trigram 模块 (pg_trgm) 进行文本搜索。我已经能够使用以下调用成功找到满意的结果,以查找名称与 查询 相似的 limit 条记录:

  def self.glance(query, limit = 10)
    find_by_sql(['select *, name <-> ? as confidence from studies order by confidence limit ?', query, limit])
  end

我现在想扩展结果以包括每条记录的 similarity 函数的值和用于显示的目标 query

我相信我应该设置一个范围(或类方法),我可以在其中对距离运算符(名称 ?)进行参数化调用,然后返回值,就好像它是数据库模型。

我可以就执行此操作的最佳做​​法提出建议吗?谢谢。

【问题讨论】:

    标签: ruby-on-rails postgresql pg-trgm


    【解决方案1】:

    如果您使用study 模型,我认为您可以使用范围和 LIKE 实现如下:

    scope :glance, ->(query, limit = 10) { where('name LIKE %?%', query).order(:confidence).limit(limit) }
    

    【讨论】:

    • 感谢您的建议。我试过了,但遇到了语法错误(我确定我搞砸了)。但是,我实际上是在尝试使用 pg_trgm 函数 '' 而不是 LIKE。我最终使用了 ILIKE,但我试图让 trigrams 的搜索扩展工作。这是语法错误:PG::SyntaxError: ERROR: syntax error at or near "%" LINE 1: SELECT 1 AS one FROM "studies" WHERE (name LIKE %'drone'%) ...
    • 原始 SQL 应该是 SELECT 1 AS one FROM "studies" WHERE (name LIKE %drone%)... 不包括 '。所以,你可以改变类似..where('name LIKE ?', "%#{query}%")...
    • 我感谢所有对使用 LIKE 的引用,但我使用的是三元组 (pg_trgm) 和 距离运算符,这是我想要理解的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多