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

问题描述 投票:0回答:1

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

此标签是由客户端编写的字符串,不同实例之间可能存在很大差异。我们通常会向客户提供包含在标签中的参考信息,以便我们识别它。参考模式符合此正则表达式:

/\A[a-zA-Z]{2,5}-?\d{4}-?\d{2}-?\d{4}\z/
。例如:
"ABCDE-2023-01-0001"
"ab-2023-01-0001"

此外,我有一个

Invoice
模型,有两列:
number
moneyin_key
number
值通常遵循以下格式:
ABCDE-2023-01-0001
moneyin_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 model scope
1个回答
0
投票

您可以在这里使用 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')
}
© www.soinside.com 2019 - 2024. All rights reserved.