提问人:raphael-allard 提问时间:11/5/2023 更新时间:11/6/2023 访问量:94
如何检查列值是否包含在字符串中
How to check if a column value is contained within a string
问:
当我公司的银行账户收到付款时,我们的应用程序会触发一个 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}%")
}
有什么想法吗?
答:
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)
}
评论