0

我正在开发我的第一个大型 Rails 应用程序,但我对某些事情感到有些困惑。

我知道在数据库级别做更多的工作会提高性能。但是我对在数据库级别运行什么类型的命令感到困惑。

例如:

@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>

这在数据库级别上工作吗?

谢谢,我知道这是一个非常新手的问题!

4

3 回答 3

1

假设@project一个 ActiveRecord 对象与 Task 类有关系,然后对数据库进行提取以填充该@tasks对象。

当你运行 rails server 时,观察控制台的输出。它会在对数据库进行 SQL 查询时向您显示。这将帮助您了解代码执行的过程。享受 Rails 的乐趣!

于 2013-02-20T17:53:11.870 回答
1

“在数据库级别做更多的工作将提高性能”

是的,它会。非常基本的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 机器和数据库机器之间存在网络延迟,这也会影响性能。

于 2013-02-20T18:09:09.977 回答
0

数据库级别实际上并不是代码的一部分,除非您实际编写要使用的数据库。良好的程序设计接口与数据库,例如您给 mysql 一个查询,它为您查询数据库并返回您在代码中使用的结果。所以数据库级别是 mysql 查询自己的结果,这是您希望完成大部分工作的地方,因为它已经高度优化。性能的来源是倾销大部分工作,例如,您可以制定一个查询,例如:“SELECT * from mytable”,然后您将获得一大堆元素,如果那是您想要的,那么很好,但如果您想要这个集合中的特定项目,你必须在整个集合上使用一些查找算法(可能必须扫描它们全部或其他,

于 2013-02-20T18:24:59.400 回答