如何检查列值是否包含在字符串中

How to check if a column value is contained within a string

提问人:raphael-allard 提问时间:11/5/2023 更新时间:11/6/2023 访问量:94

问:

当我公司的银行账户收到付款时,我们的应用程序会触发一个 webhook,提供与付款相关的数据,包括付款标签。

此标签是由客户端编写的字符串,从一个实例到另一个实例可能会有很大差异。我们通常会向客户提供参考,以包含在标签中,以便我们识别它。引用模式符合以下正则表达式:。例如:或等。/\A[a-zA-Z]{2,5}-?\d{4}-?\d{2}-?\d{4}\z/"ABCDE-2023-01-0001""ab-2023-01-0001"

此外,我还有一个包含两列的模型:和 .该值通常遵循以下格式:并且该值相同,但没有连字符,例如 .Invoicenumbermoneyin_keynumberABCDE-2023-01-0001moneyin_key"ABCDE2023010001"

我想创建一个范围来检索与客户提供的标签相关的所有发票。如前所述,标签可能会有很大差异,但这里有一个示例:我的范围应按如下方式构建:"VIR. O/ JUMBO VISMA MOTIF: EDP2023100001"

scope :related_to_payment_label, -> (label) { do_something_here }

我尝试了几种方法,但没有一种方法成功。例:

scope :related_to_payment_label, -> (label) {
  where("number ILIKE :label OR moneyin_key ILIKE :label", label: "%#{label}%")
}

有什么想法吗?

Ruby-on-Rails Ruby PostgreSQL 模型 范围

评论


答:

1赞 Antonio 11/5/2023 #1

您可以像这样在此处使用 REGEXP 函数:

scope :related_to_payment_label, -> {
  where("number REGEXP :regexp OR moneyin_key REGEXP :regexp", regexp: '[a-zA-Z]{2,5}-?\d{4}-?\d{2}-?\d{4}\z')
}

或者,如果您的数据库是 Postgres,则可以用于不区分大小写的正则表达式和区分大小写的~*~

例如:

scope :related_to_payment_label, -> {
  where("number ~* :regexp OR moneyin_key ~* :regexp", regexp: '[a-zA-Z]{2,5}-?\d{4}-?\d{2}-?\d{4}\z')
}

评论

0赞 raphael-allard 11/6/2023
谢谢你的帮助,安东尼奥。这里的概念是为范围提供一个包含客户端标签的参数。此标签应与必须与数字或moneyin_key值匹配的引用相对应。
1赞 Kihara 11/6/2023 #2

可以在作用域中使用自定义 SQL 查询。您需要从付款标签中提取参考模式,然后使用它来搜索相关发票。这是你如何做到的:

scope :related_to_payment_label, -> (label) {
  reference = label.match(/\b[a-zA-Z]{2,5}-?\d{4}-?\d{2}-?\d{4}\b/).to_s

  where("number = :reference OR moneyin_key = :reference", reference: reference)
}