ActiveRecord视图为单记录方法生成的SQL

ActiveRecord视图为单记录方法生成的SQL,activerecord,ruby-on-rails-6,Activerecord,Ruby On Rails 6,ActiveRecord允许您查看为集合生成的SQL: User.all.to_sql 如何返回为返回单个记录的方法生成的SQL User.find(1).to_sql # not valid User.print_sql.find(1) # something like this? to_sql方法是在ActiveRecord::Relation类中定义的,因此您最好使用 User.whereid:1.to_sql =>从\users\WHERE\users\中选择\users\..\id

ActiveRecord允许您查看为集合生成的SQL:

User.all.to_sql
如何返回为返回单个记录的方法生成的SQL

User.find(1).to_sql # not valid
User.print_sql.find(1) # something like this?
to_sql方法是在ActiveRecord::Relation类中定义的,因此您最好使用

User.whereid:1.to_sql =>从\users\WHERE\users\中选择\users\..\id\=1 更新

好的,让我们转到Rails 6源代码。下面是activerecord/lib/active_record/core.rb的摘录

def find*ids:nodoc: 我们还没有这些东西的缓存密钥 返回super,除非id.length==1 如果给定block_,是否返回super|| 主密钥为0|| 范围属性|| 列\u散列.key?继承\u列&!基类? id=id.first 返回super if语句缓存。不支持的值?id 键=主键 语句=cached_find_by_语句key{| params| wherekey=>params.bind.limit1 } 记录=语句。首先执行[id],连接和 除非有记录 raise RecordNotFound.new找不到{key}={id},name,key,id的{name} 终止 记录 终止 可以清楚地看到,find方法被扩展为primary_key=>id.limit1,然后结果取自返回的ActiveRecord::Relation集合的第一个元素

find_by method采用的方法与后面在同一文件中看到的方法相同

因此,User.find1和User.whereid:1.limit1在语义上是等价的。

User.whereid:1.limit1.to\u sql

这就是当您使用find_by时在SQL中运行的基本内容

为查找查询(即User.find1)生成的sql为


您认为主键约束上的where子句可以返回多个记录吗?然后把你的问题说得更清楚。我的问题很清楚。请重读。我在我的问题中给出了你的答案。对不起,我最初的评论有错。我的意思是不适用于像find_by这样的单记录方法,但我无意中编写了find_all@LyzardKyng这是正确的。除了find之外,sql还增加了一个限制,您也会得到一个负号:Rails控制台显示为find请求生成的sql。这就是我展示的。
SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], 
["LIMIT", 1]]