2013-02-20 53 views
0

我正在處理我的第一個大型Rails應用程序,並且對某些事情有點困惑。Rails 3 - 在「數據庫級別」執行更多操作

我知道在數據庫級別做更多的工作會提高性能。但是我很困惑在數據庫級別運行的是哪種類型的命令。

例如:

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

那是工作在數據庫級別?

謝謝,我知道這是一個非常新手的問題!

回答

1

'在數據庫級別做更多工作會提高性能'

是的。非常基本的東西的軌道即

@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仍然是一種解釋型語言。另外,在第一個例子中,所有東西都是從數據庫中請求的,如果RoR機器和數據庫機器之間存在網絡延遲,那麼只會返回名稱中帶'foo'的東西,這也會影響性能。

+0

謝謝!正是我期待的區別。 – nathan 2013-02-20 18:24:05

1

假設@project是一個與任務類的關係的ActiveRecord對象,然後對數據庫執行提取以填充@tasks對象。

當您運行rails server時,請觀察控制檯的輸出。它會向您顯示何時對數據庫執行SQL查詢。這將幫助您瞭解代碼執行過程。與Rails玩得開心!

0

除非您實際編寫要使用的數據庫,否則數據庫級別實際上並不是您的代碼的一部分。良好的程序設計與數據庫接口,就像你給mysql一個查詢並且爲你查詢一個數據庫並返回你在代碼中使用的結果。所以數據庫級別是mysql自己查詢結果,這是你完成大部分工作的地方,因爲它已經被高度優化了。性能來的地方是傾銷大部分工作,例如,你可以制定一個查詢,如:「SELECT * from mytable」,然後你將得到一大堆的元素,如果這就是你想要的,那麼很棒,但如果你想要從這個集合中選擇一個特定的項目,你必須在整個集合上使用一些查找算法(可能必須掃描它們的全部或其他內容,它的性能很差),或者你可以更具體地查詢數據庫(SELECT * from mytable WHERE x等等),並返回一小組準備使用的結果,那99%的時間會給你更好的表現。

相關問題