重要的是要從未使用Something.all.first
,而使用Something.first
。前者加載每個單獨的記錄到你的表中,然後取第一個,丟棄其餘的。後者載入第一條記錄。在大型表中,當Rails進程佔用幾千兆字節的內存時,這會造成非常嚴重的問題。
如果要選擇多個號碼的記錄,這樣來做:
numbers = Number.find_all_by_id([ 0, 4 ])
numbers.each do |number|
number.something = something
number.save
end
更先進的方式來做到這一點是:
Number.update_all({ :something_id => something.id }, { :id => [ 0, 4 ] })
總是看看log/development.log
呈現給查詢瞭解ActiveRecord如何解釋您的呼叫。結果可能令人驚訝,特別是對於外行人士。
A has_many
關係暗示數字belongs_to
東西。這也意味着Number有一個需要操作的something_id
列。您沒有在數字記錄中進行任何保存,因此它們可能無法正確關聯。我認爲Rails 3比Rails 2處理得更好,它更接近你期望的。
請記住總是針對非平凡的數據集測試您的應用程序。生成足夠數量的假測試數據以確保正確處理分頁,並且在開發週期中很早就會發現調用all
等錯誤。
只有在使用all
纔是安全的唯一場合是,如果您完全確定列表中項目的數量是可接受的小。用戶提供的數據很少出現這種情況。如果用戶可能列表中有一千個項目,其中一個可能會。
但我不想堅持下去。只需要在對象級別擁有該屬性。 – ted
沒有結果。 RoR v.2.3.7 – ted
嗯。 「沒有結果」是什麼意思? –