好奇,如果有人知道find_by
的复杂性,因为我检查了文档并且无法找到信息。
我知道find
用于通过以下主键查找:
@user = User.find(params[:id])
,返回正确的用户。
在我更正我的代码之前,它是@user = User.find_by(params[:id])
并返回了一个ID高于我的数据库中用户数的用户。
任何人都可以帮助我了解幕后发生的事情吗?当省略返回该奇怪用户对象的参数时,默认情况下find_by是什么搜索的?
答案 0 :(得分:0)
请查看here。
以下是find_by的摘录:
查找与指定条件匹配的第一条记录。没有隐含的订单,所以如果订单很重要,您应该自己指定。
如果未找到记录,则返回nil。
Post.find_by name: 'Spartacus', rating: 4
Post.find_by "published_at < ?", 2.weeks.ago
那是你在找什么?
更新
User.find_by(3)
equivalent到User.where(3).take
这是控制台的输出
pry(main)> User.where(3).take
#=> User Load (0.3ms) SELECT `users`.* FROM `users` WHERE (3) LIMIT 1
答案 1 :(得分:0)
看起来rails看起来像是内存中对象的id。这就像查询User.find(params[:id]).object_id
。但为什么会这样呢?我尝试在4.2.4版本的应用上做同样的事情,一切顺利
答案 2 :(得分:0)
find_by_field(value)
等同于where(field: value)
,但如果没有在您提到的方法中附加字段名称,则不应该使用它。而且它只返回第一个匹配值。例如,您可以使用User.where(name: 'John').limit(1)
来代替User.find_by_name 'John'
。
就我而言,当find_by
工作时,使用find_by_id
和postgresql会引发错误:
User.find_by(1)
SELECT "users".* FROM "users" WHERE (1) ORDER BY "users"."email" ASC LIMIT 1
PG::DatatypeMismatch: ERROR: argument of WHERE must be type boolean, not type integer
User.find_by_id 1
SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."email" ASC LIMIT 1
<User id: 1, ...
User.where(id: 1) # note that there is no LIMIT 1 in the generated SQL
SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."email" ASC
您可以使用gem query_tracer查看生成的SQL或查看此thread。