【发布时间】: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.where和Group.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 为
550058和265492的组?或者直接在db中。
标签: mysql ruby-on-rails activerecord ruby-on-rails-4