2011-12-06 16 views
1

也許這只是Rails的工作方式,但我想仔細檢查,因爲我對它很陌生,而且我不確定是否缺少某些東西。belongs_to關係不工作,直到我保存 - 我'做錯了'?

我正在創建一組相當複雜的模型,它有一些嵌套的has_many/belongs_to關係。最初,我嘗試了使用create()方法,但是由於它每次啓動一次數據庫連接,最終花費的時間比它應該多得多。因此,我使用new()創建所有對象,使用< <將嵌套模型添加到更高的模型,然後在最後我在頂層模型上執行save()。

這一切工作,但我注意到belongs_to關係不工作,直到我保存。換句話說:

class Foo < ActiveRecord::Base 
    has_many :bars 
end 
class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 
f = Foo.new 
b = Bar.new 
f.bars << b 
puts "It's nil!" if b.foo == nil #yup, it's nil 
f.save 
puts "It's good!" if b.foo != nil #yup, it's good 

它是有道理的,我猜;我的意思是,它不能設置id字段指向它的Foo,直到Foo實際上一個id,並且直到我保存時纔會發生。這不是什麼大不了的事情,我只注意到它,因爲我最初編寫初始化(相當複雜)的方式,其中一個較低級別的模型需要從祖父母那裏獲取一些信息,而這種方法行不通。現在我已經把代碼清理乾淨了,但是我無法忍受這種嘮叨的感覺,我完全錯誤地做了這件事,並且永遠不會有這樣的情況:has_many關係暫時中斷,直到我實際保存到數據庫。

任何人都想讓自己放心,或者告訴我做「正確」的方式嗎?

+0

不能你只需要使用f.bars.new? –

+0

我相信f.bars.new會有同樣的問題。在實際的代碼中,我調用了一個單獨的函數來構造Bar,所以使用<<比collection.new更有意義。我同意這個玩具的例子,這樣做很愚蠢。 – user435779

回答

1

你剛纔已經回答你自己的問題與該行:

這是有道理我猜;我的意思是,它不能設置id字段指向其富,直到美孚實際上有一個ID,這將不會發生,直到我保存

由於belongs_to作品掉在酒吧外鍵匹配到Foo上的ID,直到該ID存在才能建立關係。

作爲一個側面說明,你可以做

f.bars.new 

自動設置的關係,而無需做f.bars << b

+0

很好,謝謝,只是想確保我沒有使用不好的練習或其他東西。 我有一個單獨的功能,建設酒吧(必須解析一些XML),因此使用<<而不是collection.new – user435779

+0

很高興幫助!如果這回答了您的問題,請花點時間點擊我答案旁邊的複選標記以結束該問題 – iwasrobbed

1

這是正確的;直到Foo中有一個ID,Bar沒有用於獲取其Foo

相關問題