【问题标题】:Rails4: How could ActiveRecord.find return an object with a different id to the one queried?Rails4:ActiveRecord.find 如何返回与查询对象不同的 id 对象?
【发布时间】:2013-12-03 14:22:27
【问题描述】:

我有一个问题,ActiveRecord.find 返回不正确的行,但仅在生产中。下面是一些示例代码:

    <% puts group_hash %>
    <% puts Group.find(group_hash['id'].to_i).inspect %>

哪些输出:(除 'id' 之外的所有属性都已被截断以提高可读性)

    {"id"=>550058, ....}
    #<Group id: 265492, ...>

Group.find(550058) 如何生成 id 为 265492 的记录?

我相信类似的问题正在一些地方发生。最近加载记录时似乎会发生这种情况(在上面的示例中,该组是之前在控制器中加载的),所以我怀疑缓存。

代码在 Rails3 下一直运行良好,在部署 Rails4 的那一刻,就出现了这个问题。不幸的是,我无法在任何非生产环境中重现该问题(即使是在单独主机上的完整生产克隆上,指向生产数据库),因此服务器负载可能是一个促成因素。

有什么想法吗?

【问题讨论】:

  • Group.find(group_hash['id']).to_sql 的输出是什么?注意:您的 group_hash['id'] 已经是一个 int。
  • 您是否尝试过类似:Group.where(id: group_hash['id'])Group.find_by(id: group_hash['id'])?真的,哪个 sql 产生了你的请求?
  • 我将运行更多测试并捕获 SQL 输出。 @AntonTsapov 您的 Group.whereGroup.find_by 示例不会产生与 Group.find 相同的 sql 吗?
  • Group.find(7) 将产生SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 7]]。而Group.find_by(id: 7)Group.where(id: 7).first 将执行SELECT "groups".* FROM "groups" WHERE "groups"."id" = 7 LIMIT 1。这就是我问你这两种方法的原因。
  • 你找到问题了吗?如果没有,也许您需要在 Rails 控制台中检查 ID 为 550058265492 的组?或者直接在db中。

标签: mysql ruby-on-rails activerecord ruby-on-rails-4


【解决方案1】:

我设法解决了这个问题。我仍然不知道上述情况如何或为什么会发生(当然m = Model.find(id); (id == m.id) 应该总是正确的!),尽管我仍然怀疑缓存,因为它似乎只有在缓存已启动时才会发生。

我执行了以下操作,我相信这些步骤中的某些内容解决了问题:

  1. 修剪了我的 Gemfile 删除了一些未使用的 gem,例如 dalli,并删除了除少数情况外的版本约束以允许更新。
  2. 运行 bundle update 导致大量更新的依赖项
  3. 我在 Heroku 上使用了一个自定义 buildpack(从官方 ruby​​ one 派生),我参与了过去几个月的上游更改。

感谢所有阅读和评论的人。我想我的 gem 依赖项或 heroku 环境中出了点问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多