2012-12-26 60 views
0
#model 
class Something 
has_many :numbers 
end 

#controller 
something = Something.all.first 
numbers = Number.all 
something.numbers = [numbers[0], numbers[4]] # can we do it like this? 
puts "something = #{something.inspect}" => <#Something > // with no `numbers` we've set; 

//所需的「質量standarts」張貼這個問題Rails的第2節自定義地圖屬性的對象

回答

1

,如果你先救它,然後檢查它應該工作。

如果你不想堅持它,那麼你不應該使用的has_many

只需使用一個正常的實例變量

class Something 
attr_accessor :numbers 
end 
+0

但我不想堅持下去。只需要在對象級別擁有該屬性。 – ted

+0

沒有結果。 RoR v.2.3.7 – ted

+0

嗯。 「沒有結果」是什麼意思? –

0

重要的是要從未使用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纔是安全的唯一場合是,如果您完全確定列表中項目的數量是可接受的小。用戶提供的數據很少出現這種情況。如果用戶可能列表中有一千個項目,其中一個可能會。

+0

說我有2個實體。 「一」和「二」。 「一」有很多「二」;什麼是最有效的方式來獲得與他們「兩個」所有「一」,並序列化他們得到像[#]>]? (不超過2分貝請求) – ted

+0

你需要使用':include'選項來加載關聯。 – tadman

+0

這將從數據庫中得到'twoes',但不會將它們映射到'a'對象,所以如果我們'a.to_xml'結果將是'#'而不是'#] >' – ted

相關問題