使用Active Record有什么区别?与find_by?

时间:2016-09-04 04:28:06

标签: ruby-on-rails ruby activerecord

在我的模型中,我先检查数据库中是否存在Sudoku记录,然后才能获取solution或创建它。

if Sudoku.exists?(puzzle: puzzle)
  return Sudoku.find_by(puzzle: puzzle).solution
else
  **solve it and save it into the db**
end

这样做有什么不同:

if Sudoku.find_by(puzzle: puzzle)
  return Sudoku.find_by(puzzle: puzzle).solution
else
  **solve it and save it into the db**
end

记录exists?

Sudoku Exists (0.0ms)  SELECT  1 AS one FROM "sudokus" WHERE "sudokus"."puzzle" = $1 LIMIT 1  [["puzzle", "390820700801500069020160403002096058935000602060752030703941000200037590019000347"]]
  Sudoku Load (0.0ms)  SELECT  "sudokus".* FROM "sudokus" WHERE "sudokus"."puzzle" = $1 LIMIT 1  [["puzzle", "390820700801500069020160403002096058935000602060752030703941000200037590019000347"]]
Completed 200 OK in 8ms (Views: 0.2ms | ActiveRecord: 3.0ms)

记录find_by

 Sudoku Load (0.0ms)  SELECT  "sudokus".* FROM "sudokus" WHERE "sudokus"."puzzle" = $1 LIMIT 1  [["puzzle", "390820700801500069020160403002096058935000602060752030703941000200037590019000347"]]
  CACHE (0.0ms)  SELECT  "sudokus".* FROM "sudokus" WHERE "sudokus"."puzzle" = $1 LIMIT 1  [["puzzle", "390820700801500069020160403002096058935000602060752030703941000200037590019000347"]]
Completed 200 OK in 7ms (Views: 0.2ms | ActiveRecord: 2.0ms)

起初,我想通过做两个find_by它会两次击中数据库,但后来我看到了CACHE。这是否意味着Rails会记住第一个find_by中的上一个查询,并且只打一次?

为什么我会使用exists?而不是find_by

修改

根据建议,我现在正在使用它:

if sudoku = Sudoku.find_by(puzzle: puzzle)
  return sudoku.solution
else
  **solve it and save it into the db**
end

1 个答案:

答案 0 :(得分:4)

Rails使用简单的查询缓存包装每个控制器操作。日志中的CACHE表示查询是从缓存提供的。如果您要在控制台中运行该代码,则无法获得该缓存(除非您明确设置该缓存)。

差异查询明智的是,没有从数据库中提取对象的任何字段。除了网络影响,根据查询和存在的索引,您的数据库可能能够使用覆盖索引(简而言之,索引可以用来完全回答查询而不是使用索引查找数据的数据库)对于行)

除了rails之外,没有从结果中构造一个活动记录对象,你只需返回true / false。

所以exists?更快。然而,如果你之后直接打电话给find_by,那就毫无意义了。你也可以只召唤find_by一次。