在我的模型中,我先检查数据库中是否存在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
答案 0 :(得分:4)
Rails使用简单的查询缓存包装每个控制器操作。日志中的CACHE
表示查询是从缓存提供的。如果您要在控制台中运行该代码,则无法获得该缓存(除非您明确设置该缓存)。
差异查询明智的是,没有从数据库中提取对象的任何字段。除了网络影响,根据查询和存在的索引,您的数据库可能能够使用覆盖索引(简而言之,索引可以用来完全回答查询而不是使用索引查找数据的数据库)对于行)
除了rails之外,没有从结果中构造一个活动记录对象,你只需返回true / false。
所以exists?
更快。然而,如果你之后直接打电话给find_by
,那就毫无意义了。你也可以只召唤find_by
一次。