Rails / ActiveRecord Model.Find返回错误的记录

时间:2013-11-20 06:15:59

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

这是最古怪的。

当我访问时:

/ingredients/14.json

我得到了

{ id: 13,
  name: "Tomato",
  category: "Vegetable",
  created_at: "2013-11-20T04:35:36.704Z",
  updated_at: "2013-11-20T05:59:34.444Z"
}

在日志中:

Started GET "/ingredients/14.json" for 127.0.0.1 at 2013-11-19 22:02:35 -0800
Processing by IngredientsController#show as JSON
  Parameters: {"id"=>"14"}
  Ingredient Load (0.4ms)  SELECT "ingredients".* FROM "ingredients" WHERE (14) LIMIT 1
#<Ingredient id: 13, name: "Tomato", category: "Vegetable", created_at: "2013-11-20 04:35:36", updated_at: "2013-11-20 05:59:34">
Completed 200 OK in 18ms (Views: 0.2ms | ActiveRecord: 0.6ms)

数据库中只有两个项目,#13(番茄)和#14(鸡蛋)。

我正在使用:

  • Rails 4.0.0
  • SQLite(这是一个全新的应用程序:)
  • ActiveModel :: Serializers(虽然我删除了gem和序列化程序时发现了相同的结果)
  • 粉末(但 powder restart之后继续!)
  • Batman.js(但是当我用浏览器访问网址时蝙蝠侠请求JSON 时会发生这种情况)
  • Chrome(虽然它也发生在Chrome Chrome Incognito中)

我不知道这可能是什么?任何猜测?!

更新

只是我是个白痴。看看我的坏控制器操作代码:

  def show
    @resource = @class.find_by(params[:id])
    respond_with @resource
  end

当然,这应该是:

  def show
    @resource = @class.find(params[:id])
    respond_with @resource
  end

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,你的生成SQL是错误的。生成的查询是:

SELECT "ingredients".* FROM "ingredients" WHERE (14) LIMIT 1

应该是:

SELECT "ingredients".* FROM "ingredients" WHERE id = 14 LIMIT 1

由于第一个where子句中的条件总是计算为true,因此它会随机选取1行。获取哪一行取决于DBMS如何在内部存储数据。

要知道生成的查询错误的原因,我们需要在Controller的操作中查看代码。