rails優化三 default scope是魔鬼

2021-06-28 09:15:46 字數 1137 閱讀 7208

我之前很多次使用default_scope,但是後來萬分後悔這麼做。

假設我們在模型post中定義乙個default_scope:

class post

default_scope where(published:true).order("created_at desc")

end

defaut_scope會增加一些你可能不期望的行為

1.你不能重寫default_scope。例如:缺省會按照created_at排序。

> post.limit(10)

post load (3.3ms)  select `posts`.* from `posts` where `posts`.`published` = 1 order by created_at desc limit 10

如果你想按照updated_at排序,你可能按照如下的方式進行:

> post.order("updated_at desc").limit(10)

post load (17.3ms)  select `posts`.* from `posts` where `posts`.`published` = 1 order by created_at desc, updated_at desc limit 10

但實際上,它會同時按照created_at和updated_at排序,default_scope沒有被重寫,你需要unscope方法來禁用default_scope。

> post.unscoped.order("updated_at desc").limit(10)

post load (1.9ms)  select `posts`.* from `posts` order by updated_at desc limit 10

2.default_scope會影響model的初始化

> post.new

=> #

很多開發者沒有意識到這一點,誤以為default_scope只會對查詢起作用,實則不然。

因此,盡量不要使用default_scope,僅僅把它定義為乙個scope就很好,呼叫scope即可。 

Rails詳細介紹(三)命名約定

rails命名約定。1.混合大小寫,下劃線,複數 變數,全部字母都小寫,單詞的中間使用下劃線分割 類 class 和modules 首字母使用大寫。例如 lineitem這樣的類名。rails使用這樣的命名約定並且作了擴充套件。首先假定資料庫中表名和變數命名一樣,採用全小寫字母,並且單詞中間使用下劃...

Rails3 入門之三 新建乙個rails工程

如果你按照這個嚮導,你將會新建乙個rails工程叫blog,乙個非常簡單的webblog。在你開始新建乙個rails工程之前,請確保你是否安裝了rails.例子裡面使用 和 來表示終端的提示符。如果你使用windows,你的終端提示符 應該是像這樣的 c source code3.1 安裝rails...

Rails應用效能優化一例

rails是一款經典的web開發框架,它的許多設計思想為使用者帶來了很多開發上的便利。它非常適合於快速搭建web應用程式,修改和維護的便利性使它受到許多創業型公司的青睞。然而過度地依賴其所帶來的便利而不加節制地使用,往往會隨著程式複雜度的增加,出現效能上的降低。對於大多數創業型公司的初級產品來說,還...