Rails`find_by`返回巨大的ID

时间:2015-11-18 21:21:21

标签: ruby-on-rails

好奇,如果有人知道find_by的复杂性,因为我检查了文档并且无法找到信息。

我知道find用于通过以下主键查找: @user = User.find(params[:id]),返回正确的用户。

在我更正我的代码之前,它是@user = User.find_by(params[:id])并返回了一个ID高于我的数据库中用户数的用户。

任何人都可以帮助我了解幕后发生的事情吗?当省略返回该奇怪用户对象的参数时,默认情况下find_by是什么搜索的?

3 个答案:

答案 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) equivalentUser.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