在数据库中有一个带有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
。主键必须是唯一的,因此很明显只返回一个结果吗?
回顾我的问题:
find
方法生成'有效' SQL(即SQL
可以粘贴在Rails数据库控制台并工作)LIMIT
查询中包含find
。答案 0 :(得分:1)
SQL没有错。 Rails向您展示最后注入的内容。它本质上是将SQL语句转换为:
SELECT" articles"。* FROM" articles"在哪里"文章"。" id" = 1 LIMIT 1
使用find,您只需要查找包含主键的单行。 Ruby确保找到的内容应该只是一行。由于您有一个文章ID,它将返回该数据。
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
。