我正在使用twilio在我的rails应用程序中提供音频会议功能。当我拨打我的会议号码时,twilio传递了几个值 - 包括“发件人”,其中包含国际格式的来电者电话号码。
我的系统中的每个用户都有一个配置文件,在我的控制器中,我查询配置文件以提供个性化的欢迎消息。每个配置文件包含0到3个数字(主要,次要和手机),我需要根据所有配置文件中的这三个字段检查呼叫者的ID。
当我在开发机器上使用控制台时,以下代码会找到正确的配置文件:
Profile.find_by('+44000000000')
当我上传到heroku时,我使用以下代码:
name = Profile.find_by(params['From']) || 'there'
这会导致我的应用出错:
2014-04-03T19:20:22.801284+00:00 app[web.1]: PG::DatatypeMismatch: ERROR: argument of WHERE must be type boolean, not type bigint
2014-04-03T19:20:22.801284+00:00 app[web.1]: LINE 1: SELECT "profiles".* FROM "profiles" WHERE (+4400000000) ...
有任何建议可以解决这个问题吗?
谢谢!
其他信息:
我认为我的问题是我不知道如何一次查询整个配置文件或三列。现在代码:
name = Profile.find_by(params['From'])
不正确(params ['From']包含一个电话号码)因为我没有告诉rails查询列主要电话号码,辅助电话号码和手机。我也不会查询整个档案,这也是一种选择。
所以问题基本上是:
如何更改此代码:
Profile.find_by(params['From'])
这样它就可以查询所有个人资料中的所有字段,或只查询每个个人资料包含的电话号码的三列?
是否有类似Profile.where(:primary_number).or.where(:secondary_number)or.where(:cellphone) => params['From']
答案 0 :(得分:1)
我不熟悉twilio并且不确定这是否有帮助,但查找和 find_by_attribute_name 接受值数组作为选项:
name = Profile.find_by([params['From'], 'there'] )
假设params['From']
这里,这应该生成:
SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`attribute` IN ('here', 'there')
如果您尝试在运行时构建动态匹配器(称为 Meta-programming ),则可以尝试以下代码:
name = eval(“Profile.find_by _#{params ['From'])||'there'}(其余查询参数此处)”)
首先,我认为您没有正确使用find_by
!正确的语法是:
Model.find_by(attribute_name: value)
#e.g
Profile.find_by(phone_number: '0123456')
将调用where
并检索一条记录,但传递一个值会产生一个总是通过的条件,例如:
Model.find_by('wrong_condition')
#will generate SQL like:
SELECT `models`.* FROM `models` WHERE ('wrong_condition') LIMIT 1
#which will return the first record in the model since there is no valid condition here
你为什么不试试:
Profile.where('primary_number = ? OR secondary_number = ? OR cellphone = ?', params['From'], params['From'], params['From'])
答案 1 :(得分:1)
您可以编写如下查询:
Profile.where("primary_number = ? or secondary_number = ? or cellphone = ?", params['From'])
只需仔细检查语法,但应该这样做。