ActiveRecord视图为单记录方法生成的SQL
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
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]]