当我公司的银行账户收到付款时,我们的应用程序会触发一个 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}%")
}
有什么想法吗?
您可以在这里使用 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')
}