我有一个名为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和数据库的数据类型,它们都是字符串。
这会导致什么?我该如何解决这个问题?
答案 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'