2017-10-10 102 views
0

創建用戶後,我需要在表inventory中創建4條記錄。我知道,我需要使用回調after_create,但我猜它根據最佳實踐和DRY原則有4條線這樣不好:創建記錄後創建關聯

def create_items 
    Item.create({user_id: self.id, item_id: 1}) 
    Item.create({user_id: self.id, item_id: 2}) 
    ... 
end 

,或者甚至這樣呢?

def create_items 
    self.inventories.create([ 
     {item_id: 1}, 
     {item_id: 2} 
    ]) 
end 
+0

您可以使用範圍「[* 1..4] .each do | i |」 – TopperH

+0

@TopperH'id'不是爲了:(另外,也許我應該使用關聯,不要每次都通過user.id? – Src

+0

@TopperH爲什麼不是'(1..4).each do | i |'? – tadman

回答

5

奧芬你可以用has_many :through解決這個問題:

class Inventory 
    belongs_to :user 
    belongs_to :item 
end 

class User 
    has_many :inventories 
    has_many :items, through: :inventories 
end 

然後你可以將它們添加直線上升:

items.each do |item| 
    @user.items << item 
end 

如果只有ID值:

Item.where(id: ids).each do |item| 
    @user.items << item 
end 

這是一般的Ÿ有效率足以完成工作。如果您遇到嚴重的負載問題,您可以使用批量插入插件來完成此操作,但這通常是最後一招。

+0

謝謝你的回覆。我的任務是添加這些項目在創建用戶後進行清點我怎樣才能用你編寫的代碼來做到這一點? – Src

+0

你可以在你想要的任何地方放置這段代碼,即使在'after_create'回調中 – tadman

+0

哦,等一下,現在我明白了)謝謝) – Src