2009-12-21 69 views
0

我有一個簡單的查找語句,例如:鐵軌/ ActiveRecord的搜索渴望加載協會

m = MyModel.find(1, :include => :my_children) 

隨着m.mychildren作爲一個數組;無論如何都可以從數組中找到一條特定的記錄,而無需遍歷整個事物。如果我mychildren.find(1),一個新的數據庫查詢是問題,這是沒有道理的,因爲它們全部已加載

回答

0

我不太清楚你問什麼,但你有沒有試過select

m.mychildren.select{ |child| child == <<some_statement>> } 

這不會碰到數據庫假設你已經使用了:include的選擇,因爲你在你的問題說明。

另外,如果你知道你想要孩子的數量,你應該能夠只使用

m.mychildren[1] 
+0

我知道孩子的ID,而不是數組中的索引。我知道默認的ruby數組函數。我只是想知道是否有一些鐵軌monkeypatch增加了一些支持查找孩子。 – gmoniey 2009-12-22 00:06:46

1

它看起來像有一個小的Rails魔術會在這裏。 Enumerable#findActiveRecord::Base#find覆蓋爲關聯創建的方法。

上方Enumerable#find的別名爲Enumerable#detect。 不幸的是Enumerable#find/Enumerable#detect與ActiveRecord :: Base#find有很大不同。

所以你不能只是做mychildren.find(1),而如果你想避免再次擊中數據庫,你必須做mychildren.detect{|c| c.id == 1}。你也可以考慮擴展Array來做更乾的方法。

class Array 
    def id_find id 
    self.detect{|element| element.id == id} 
    end 
end 
+0

有趣。我想這就像做.collect一樣。我希望軌道可能會哈希ID的封面下快速查找。 – gmoniey 2009-12-22 03:53:05

+0

No. collect將返回一個數組,該數組是針對調用數組的每個索引評估塊的結果。而我的解決方案中的代碼。返回數組中塊的計算結果爲true的第一個項目。 – EmFi 2009-12-22 04:48:39

+0

啊......謝謝你清理那個 – gmoniey 2009-12-22 07:32:59