【问题标题】:Activerecord can't find model by attribute, even though the query is correct即使查询正确,Activerecord 也无法按属性查找模型
【发布时间】:2011-11-22 05:57:43
【问题描述】:

我有一个名为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 和数据库的数据类型,它们都是字符串。

是什么原因造成的?我该如何解决这个问题?

【问题讨论】:

  • 如果直接执行那个 SQL 会发生什么?
  • 一样,不过——我忘了​​提——当我使用 LIKE 而不是 = 时,它确实找到了它。
  • 补充一下,这是首先生成code的代码(在模型初始化时):self.code = ActiveSupport::SecureRandom.hex(5) if self.code.blank?。我已经尝试在它后面加上 to_s,但这没有效果。

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


【解决方案1】:

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

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

【讨论】:

  • 嗯,我使用了一个应用程序来检查 sqlite 文件,但 code 字段是 VARCHAR 并且行中没有尾随空格,但是提示 tnx
  • 哇,猜的不错。我从来没有想过这个:)
  • 不,它没有。不过似乎。这可能有点牵强,但似乎在我实际向特定的invitation 行提交了表单之后,查询确实有效。会不会是最初的存储方式有问题?
  • 如果你能复制这个,看看HEX(code)返回什么。对于您的 86f50776bf 示例,这应该是 38366635303737366266。如果最后有额外的字节,您可能会遇到填充问题。
  • 嗯……十六进制是一样的,所以没有额外的值。当我也HEX输入值时,两个值是一样的
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    @马可,

    如何声明代码变量?作为字符串?

    例子:

    code = "86f50776bf"
    

    code = '86f50776bf'
    

    ?

    【讨论】:

    • 在上面的代码中,我直接从另一个查询 (Invitation.first.code) 的结果中分配它,而在实际应用程序中,我从 session[:code] 变量中分配它。即使我直接在控制台中赋值(大多是双引号),效果也不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多