即使查询正确,Activerecord也无法按属性查找模型

时间:2011-09-21 19:11:10

标签: ruby-on-rails ruby-on-rails-3 sqlite activerecord

我有一个名为Invitation的模型,它有一个名为code的属性。该应用程序的目标是使用在某处输入的代码找到正确的邀请。

然而,我的问题是,即使输入正确,ActiveRecord似乎也无法在数据库中查询时找到任何结果。我已经创建了这个小测试来说明问题:

ruby-1.9.2-p290 :003 > code = Invitation.first.code
Invitation Load (0.4ms)  SELECT "invitations".* FROM "invitations" LIMIT 1
=> "86f50776bf" 

所以此时我已将此邀请的代码加载到变量

ruby-1.9.2-p290 :004 > i = Invitation.where(:code => code)
Invitation Load (0.2ms)  SELECT "invitations".* FROM "invitations" WHERE "invitations"."code" = '86f50776bf'
=> [] 

即使代码直接来自数据库,查询的响应也是一个空数组。使用code == Invitation.first.code查看值是否相等时,它会返回true。我已经检查了Ruby和数据库的数据类型,它们都是字符串。

这会导致什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

根据您的评论,可能是列不是VARCHAR而是CHAR,或者它包含由ActiveRecord ORM层或数据库驱动程序修剪的尾随空格。 'foo''foo '不等同,但它们LIKE足以匹配。

您可能希望将该列切换为可变长度,或调整查询以进行测试:RTRIM(code)=?

答案 1 :(得分:1)

当我偶然发现this answer时,我找到了解决方案:

  

在Ruby 1.9中,所有字符串现在都已编码。默认情况下,所有字符串都应为UTF-8,但SecureRandom.hex(30)将返回ASCII-8BIT的编码。

在执行密钥时将.force_encoding('UTF-8')添加到密钥解决了问题:)

答案 2 :(得分:0)

@Marco,

如何声明代码变量?作为String?

示例:

code = "86f50776bf"

code = '86f50776bf'