由Rails生成的SQL查询#find方法

时间:2014-06-29 14:04:32

标签: sql ruby-on-rails

在数据库中有一个带有id,title,created_at和updated_at列的文章模型,模型中没有其他逻辑。在Rails控制台中,find方法生成以下查询:

Article.find(1)
# Article Load (2.8ms)  SELECT  "articles".* FROM "articles"  WHERE "articles"."id" = ? LIMIT 1  [["id", 1]]

我很惊讶地发现这个查询在rails db console中运行时会引发语法错误:

$ rails db
sqlite> SELECT  "articles".* FROM "articles"  WHERE "articles"."id" = ? LIMIT 1  [["id", 1]];
Error: near "[["id", 1]": syntax error

我也很惊讶在查询中看到LIMIT 1。主键必须是唯一的,因此很明显只返回一个结果吗?

回顾我的问题:

  1. 为什么find方法生成'有效' SQL(即SQL 可以粘贴在Rails数据库控制台并工作)
  2. 为什么LIMIT查询中包含find

2 个答案:

答案 0 :(得分:1)

  1. SQL没有错。 Rails向您展示最后注入的内容。它本质上是将SQL语句转换为:

    SELECT" articles"。* FROM" articles"在哪里"文章"。" id" = 1 LIMIT 1

  2. 使用find,您只需要查找包含主键的单行。 Ruby确保找到的内容应该只是一行。由于您有一个文章ID,它将返回该数据。

  3. http://guides.rubyonrails.org/active_record_querying.html#retrieving-a-single-object

答案 1 :(得分:1)

  

为什么find方法不能生成'有效'的SQL(即可以在Rails数据库控制台中粘贴并运行的SQL)

关键是你看到的输出不是复制和粘贴到数据库控制台。它只是在那里它会让你有一些感觉它内在的东西。我想如果你适当地映射这些值,那就好了。另外,如果您有兴趣查找给定ActiveRecord对象的sql,可以在其中调用to_sql

  

为什么LIMIT包含在查询查询中

find方法接受任意数量的参数。因为,你传递了一个论点,rails责任给你回1条记录。可能是id可能出现不止一次的情况,只是为了避免他们追加的所有这些不良情景limit 1

如果您传递了多个参数find(1,2,3),则它不会附加limit子句,因为在这种情况下,您将获得Array而不是model