Ruby on rails Rails按字段中的位数进行查询

Ruby on rails Rails按字段中的位数进行查询,ruby-on-rails,postgresql,activerecord,rails-activerecord,Ruby On Rails,Postgresql,Activerecord,Rails Activerecord,我有一个Rails应用程序,其中有一个表:“clients”。clients表有一个字段:phone。电话数据类型为字符串。我正在使用postgresql。我想写一个查询,选择电话值超过10位的所有客户机。手机没有特定的格式: +1 781-658-2687 +1 (207) 846-3332 2067891111 (345)222-777 123.234.3443 etc. 我一直在尝试以下的变化: Client.where("LENGTH(REGEXP_REPLACE(phone,'[^\

我有一个Rails应用程序,其中有一个表:“clients”。clients表有一个字段:phone。电话数据类型为字符串。我正在使用postgresql。我想写一个查询,选择电话值超过10位的所有客户机。手机没有特定的格式:

+1 781-658-2687
+1 (207) 846-3332
2067891111
(345)222-777
123.234.3443
etc.
我一直在尝试以下的变化:

Client.where("LENGTH(REGEXP_REPLACE(phone,'[^\d]', '')) > 10")
任何帮助都会很好。

试试这个:

phone_number.gsub(/[^\d]/, '').length

您几乎拥有了它,但是您缺少了
regexp\u replace
'g'
选项,该选项来自:

regexp\u replace
函数为匹配POSIX正则表达式模式的子字符串提供新文本的替换。[…]flags参数是一个可选的文本字符串,其中包含零个或多个单字母标志,这些标志会更改函数的行为。Flag
i
指定不区分大小写的匹配,而Flag
g
指定替换每个匹配子字符串,而不是仅替换第一个子字符串

因此
regexp\u replace(string,pattern,replacement)
的行为类似于Ruby的
string\sub
,而
regexp\u replace(string,pattern,replacement,'g')
的行为类似于Ruby的
string\gsub

您还需要通过双引号Ruby字符串获得一个
\d
,一直到PostgreSQL,因此您需要在Ruby中说
\\d
。当每个人都想使用相同的转义字符时,事情往往会变得一团糟

这应该满足您的要求:

Client.where("LENGTH(REGEXP_REPLACE(phone, '[^\\d]', '', 'g')) > 10")
# --------------------------------------------^^---------^^^

Client如何。其中(“LEN(REGEXP_REPLACE(phone,[^\d],'')”)
@SteveTurczyn:PostgreSQL没有
LEN
功能,
length
是正确的选择。谢谢,但我正在寻找活动记录查询