2013-03-02 69 views
1

正如我們所知,範圍在調用時開始加載。所以這個表達式Rails中的懶惰範圍

articles = Article.published 
articles.newest 

得到2個查詢。是的,我們可以這樣做

articles = Article.published.newest 

但是如果我需要條件呢?如果foo ==欄比繼續鏈。

+0

我們可以看到您的文章模型嗎?一般而言,在您嘗試遍歷結果或某些其他方法調用(如count)之前,不應執行查詢。 – 2013-03-02 13:55:12

+0

Artcile是抽象的。查詢應該是,但不是範圍。 – Meliborn 2013-03-02 13:57:20

+0

作用域是相同的。他們不會立即執行。 – 2013-03-02 13:58:33

回答

9

你是不正確的。在你的例子中,兩行:

articles = Article.published 
articles.newest 

這不會產生兩個查詢。你能夠繼續鏈接的原因是這些調用將返回一個ActiveRecord::Relation,它只會在遍歷或選擇少數其他方法調用(如count,sum或其他聚合方法)上執行查詢。

如果您在控制檯中查看此內容,則會顯示每行都會生成查詢。這是因爲在控制檯中,每次評估後都會調用隱含的inspect調用,這將生成查詢。

+0

鏈接到文檔或來源證實此索賠將是有用的。 – Epigene 2017-10-03 12:23:49

0

同一個表中的條件?

@a = Article.where("published = true AND foo = bar").order("publishing_date desc").limit(1) 

如果您需要使用多個表進行急切加載,請使用includes(...)方法。

0

你可能只是做象下面這樣:

articles = foo == bar ? Article.published.newest : Article.published 
+0

它會2查詢。但Articles.published.newes - 一個。 – Meliborn 2013-03-02 13:52:22

+0

但是如果我有兩個以上的範圍? – Meliborn 2013-03-02 13:57:57