2011-07-19 59 views
1

單個請求多個哈希我想要做的事有點像 -充分利用在軌&SQL

@apples = Fruit.find :all, :conditions => ["type = ?", "apple"] 
@pears = Fruit.find :all, :conditions => ["type = ?", "pear"] 
@tomatos = Fruit.find :all, :conditions => ["type = ?", "tomato"] 

問題是這需要3個DB請求。有沒有一種方法來組合這些,所以它只提出一個請求,但獲得所有必需的信息?

謝謝, 亞歷克斯

+1

其實這是你能做的最好的。你可以做一個請求,但是隨後用Ruby分組rsurult – fl00r

+0

啊,沒有魔法RoR技巧!我知道你可以將結果分成紅寶石,但如果你有一個大的數據庫,這可能會導致稅收。 –

回答

1

就像已經表示,在comment,運行一個大的查詢和獲取所有條目,然後通過紅寶石選擇它們可以在一個痛苦的屁股。有幾個原因讓(你正在使用或任何數據庫),MySQL的做的工作:

  1. 如果你有1首萬個條目,紅寶石必須初始化百萬ActiveRecord對象。這會非常快速地消耗內存,並且可能使您的應用程序無法使用,特別是在生產中。設想100個用戶訪問您的網站,並且您的每個dynos(希望您擁有多個)都必須加載100萬個條目並比較100萬個字符串!

  2. 讓數據庫完成他們的工作。他們喜歡他們的工作,而且他們非常擅長。事實上,它們已經過優化以運行這樣的查詢。如果您的數據庫看起來很慢,請檢查您的索引並在必要時調整它們。

  3. 它讓你的代碼變得醜陋,甚至有可能不可讀,然後將它分開,而不是3個變量,每個變量都在自己的行中定義和提取。

1

我想你可能需要獲得所有的水果,其類型可以是「蘋果」和「梨」或「番茄」,然後在紅寶石迭代,以創建所需的水果的集合。

@fruits = Fruit.find :all, :conditions => ["type = ? or type =? or type =? , "apple", "pear", "tomata"] 

然後在Ruby中,你可以做這樣的事情(很基本的)。

@apples = @fruits.select{|f| f.type == "apple"} 
+1

首先,Rails很聰明,可以做這樣的事情:'@fruits = Fruit.find(:all,:conditions => {:type =>%w [apple pear tomato]})'第二,這種方法很多然後再慢點擊數據庫3次。如果你的數據庫有一百萬個條目,Ruby必須實例化一百萬個對象! –

+0

性能是一個完全不同的問題。據我所知,實例化對象或在ruby中進行選擇將比數據庫命中(網絡或I/O調用)更快(如在內存中),但根據具體情況可能有所不同。 – naren