我正在开发我的第一个大型 Rails 应用程序,但我对某些事情感到有些困惑。
我知道在数据库级别做更多的工作会提高性能。但是我对在数据库级别运行什么类型的命令感到困惑。
例如:
@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>
这在数据库级别上工作吗?
谢谢,我知道这是一个非常新手的问题!
我正在开发我的第一个大型 Rails 应用程序,但我对某些事情感到有些困惑。
我知道在数据库级别做更多的工作会提高性能。但是我对在数据库级别运行什么类型的命令感到困惑。
例如:
@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>
这在数据库级别上工作吗?
谢谢,我知道这是一个非常新手的问题!
假设@project
一个 ActiveRecord 对象与 Task 类有关系,然后对数据库进行提取以填充该@tasks
对象。
当你运行 rails server 时,观察控制台的输出。它会在对数据库进行 SQL 查询时向您显示。这将帮助您了解代码执行的过程。享受 Rails 的乐趣!
“在数据库级别做更多的工作将提高性能”
是的,它会。非常基本的rails东西,即
@thing = Thing.find(id)
效率很高,在这些情况下您通常不会关心性能,
但是,某种过滤器怎么样。
假设您想实现搜索包含特定字符集的名称的功能,(这是一个人为的示例,只是为了说明)
你可以这样做:
@things = Thing.all
@foothings = []
@things.each do |thing|
if /foo/ =~ thing.name
@foothings << thing
end
end
或者你可以这样做:
class Thing < ActiveRecord::Base
def self.filtered(what)
self.where("name like ?","%#{what}%")
end
end
@foothings = Thing.filtered("foo")
数据库将更快地执行搜索(第二个示例)。它是高度调整和优化的 C 代码(可能),其中 RoR 仍然是一种解释语言。此外,在第一个示例中,从数据库请求所有内容,在第二个示例中,仅返回名称中带有“foo”的内容,如果 RoR 机器和数据库机器之间存在网络延迟,这也会影响性能。
数据库级别实际上并不是代码的一部分,除非您实际编写要使用的数据库。良好的程序设计接口与数据库,例如您给 mysql 一个查询,它为您查询数据库并返回您在代码中使用的结果。所以数据库级别是 mysql 查询自己的结果,这是您希望完成大部分工作的地方,因为它已经高度优化。性能的来源是倾销大部分工作,例如,您可以制定一个查询,例如:“SELECT * from mytable”,然后您将获得一大堆元素,如果那是您想要的,那么很好,但如果您想要这个集合中的特定项目,你必须在整个集合上使用一些查找算法(可能必须扫描它们全部或其他,