2012-01-03 68 views
0

我正在使用Rails 3.1.3和Ruby 1.9.2,並且在我的數據庫中創建種子數據時遇到了類似bug的問題。我正在創建一個簡單的葡萄酒收集應用程序,並且我有一個Grape類,只有兩個簡單實例(name是「紅色」或「白色」)。我有一個Varietal類,其中belongs_toGrape類,也只有一個簡單的name字段。在Rails 3.1中使用對象代替ID創建調用

當我去創造一些種子數據,我使用如下代碼:

# create some reds 
r = Grape.find_or_create_by_name('Red') 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r) 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r) 
Varietal.find_or_create_by_name_and_grape_id('Malbec', r) 

# create some whites 
w = Grape.find_or_create_by_name('White') 
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w) 
Varietal.find_or_create_by_name_and_grape_id('Riesling', w) 
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w) 

奇怪的是,當我在數據庫中的數據去看看,Varietals的所有與相關的「紅色」Grape。使用Rails控制檯,我發現如果通過發現的Grape實例而不是實例本身的id字段,我會得到正確的行爲。

我錯過了什麼嗎?我認爲在Rails中,您始終可以傳遞ActiveRecord對象來代替原始ID,並且它會自動查找id字段值。

+0

我想如果你明確使用動態查找器by_grape_id,那麼它期望你通過ID。 – Johny 2012-01-03 23:08:29

+0

如果這是真的,那麼爲什麼帶有白色葡萄實例的find_by_grape_id工作得很好?另外,我注意到爲find_or_create執行的SQL首先使用白色Grape實例的ID執行正確的SELECT,但是創建Varietal的INSERT具有錯誤的ID。對我來說似乎仍然是一個錯誤。 – 2012-01-04 17:51:05

回答

0

您可以正常傳遞對象而不是ID,但這往往更多地在路由和關聯上。

你問它由grape_id找到,但傳遞一個名字和葡萄實例,這是問題所在。

如果您在查找器中規定了ID,則需要傳入ID。

0

rw應該返回Grape對象吧?所以你不能像這樣訪問他們的id元素嗎?

# save grape stuff by entering the ID instead of the object 
# create some reds 
r = Grape.find_or_create_by_name('Red') 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Malbec', r.id) 

# create some whites 
w = Grape.find_or_create_by_name('White') 
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Riesling', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w.id) 

這將通過您選擇的葡萄的ID,並將與您正在使用的動態取景器相匹配。