2011-12-18 145 views
4

我想播種我的Products並將它們分配到特定的UserStore如何種子belongs_to關聯?

Product.rb

class Product < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :store 

    def product_store=(id) 
    self.store_id = id 
    end 
end 

注:Store belongs_to的Business:business_name

Seed.rb

這是我的基本設置:

user = User.create(:username => 'user', :email => '[email protected]') 
store = Store.create(:business_name => 'store', :address => 'Japan') 

我嘗試這些,但他們沒有工作:

# This gives random ID's ranging from 1 to 4425!? 
user.products.create([{:name => "Apple", :product_store => Store.find_by_address('San Francisco, USA')}]) 

# This gives me undefined method 'walmart'. 
user.store.products.create([ {:name => "Apple"} ]) 

有沒有一種方法來設置ID的,所以我可以聯想我ProductsStoreUser


更新 -

我曾嘗試下面的答案,還是出來了成功。有誰知道另一種方式來做到這一點?

+1

你指定一個類存儲的實例來STORE_ID ..的整數值:product_store = > Store.find_by_address('美國舊金山')。這是行不通的..你應該可以使用Store.find_by_address('Japan').id代替 – shadowbq 2012-10-25 20:55:14

回答

1

嘗試這樣做

store_1 = Store.new(:business_name => 'Test Store', 
:address => 'Test Address', 
:phone_number => '555-555-555') 

store_1.id = 1 
store_1.save! 

訣竅是因爲它是保護不設置散列中的ID。

斯科特

2

或者創建您的商店。

然後提取正確的一個例如 例如,

store = Store.find_by_business_name('Test Store') 

然後基於那個 例如 創建它。

store.products.create(:product_name => "Product Test", :price => '985.93') 

然後,這將設置關係ID爲你,

+0

我必須改變我的整個問題。我爲我的場景增加了更多清晰度。感謝您的幫助。 – LearningRoR 2011-12-18 14:17:25

2

如果我沒有記錯的話,你只是想做到這一點。

user = User.create(:username => 'usertwo', :email => '[email protected]') 
walmart = Store.create(:business_name => 'Walmart', :address => 'San Francisco, USA') 

user.products.create(:name => 'Apple', :store => walmart) 

這裏我還沒有看到其他的東西嗎?

+0

我喜歡把我的id作爲數據庫的內部。執行對象到對象分配是對象的責任。 – danpickett 2011-12-18 18:14:28

+0

當我把':store => walmart'什麼都沒有創建。當我嘗試':product_store => walmart'時,它和我的第二次嘗試一樣。 – LearningRoR 2011-12-18 19:40:18

0

您可以爲此「種子遷移」創建一系列插入片段,包括每個用戶,存儲,產品等的記錄標識。您可能必須在此方法後更新數據庫序列。

另一種方法 通過GUI/web在您的Rails應用程序中創建初始記錄。 然後使用Yaml-db之類的東西。所以你可以將數據轉儲到yaml文件。你現在可以編輯這個文件(如果有必要),並使用同一個文件爲「db rake db:load」的另一個db實例生成種子

無論哪種方式....你知道Ids不會在你身上轉移當這些對象在新的數據庫實例中創建時。

我敢肯定還有其他方法可以做到這一點...甚至可能更好的方法。 這裏是寫了,我做了,而回用yaml_db種子Oracle數據庫的鏈接 http://davidbharrison.com/database_seeding_oracle

8

儘管聽起來像是您找到了解決方法,但解決方案可能會對其他人感興趣。

從原始seeds.rb

user = User.create(:username => 'user', :email => '[email protected]') 
store = Store.create(:business_name => 'store', :address => 'Japan') 

創建存儲

Store.create({ 
    user_id: user.id 
    store_id: store.id 
}, without_protection: true) 

在剪斷 「用戶」 和 「存儲」 變量聲明的原代碼。該代碼將user_id/store_id(由Store模型中的belongs_to關係推斷出的模型列)分配給「user」和「store」變量中存在的id值。

「without_protection:true」會關閉ID字段的批量分配保護。在種子文件中這是完全可以接受的,但在處理用戶提供的數據時應非常謹慎。

0

試試這個:

User.destroy_all 
Product.destroy_all 

user = User.create!([{:username => 'usertwo', :email =>'[email protected]'}, 
{:username => 'userthree', :email => [email protected]}]) 

user.each_with_index do |obj, index| 
    Product.create!([{ :product_name => 'product #{index}', :user_id => obj.id }]) 
end 

表是這樣的:

enter image description here enter image description here

相關問題