在三列中找到值的最简单方法是什么?

时间:2014-04-04 08:21:41

标签: sql ruby-on-rails heroku twilio

我正在使用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']

的内容

2 个答案:

答案 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'])

只需仔细检查语法,但应该这样做。